一个简单的对数回归实例


问题: 求西瓜数据集3.0上对数几率回归的结果

1663926623801.png

LogisticsRegression类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import numpy as np
#逻辑回归模型
class LogisticsRegression:
def __init__(self):
'''
初始化逻辑回归模型
θ向量
'''
self.theta = None

#定义sigmoid函数
def sigmoid(self,x):
'''
:param x: 转换前的输入
:return: 转换后的概率
'''
return 1/(1+np.exp(-x))

#使用梯度下降法,不断更新θ值,训练模型具体过程
def GD(self,x,y,eta=1e-3,Niters=1e4):
'''
:param x: 训练集特征数据,类型为ndarray
:param y: 训练集标签,类型为ndarray
:param eta: 学习率,类型为float
:param n_iters: 训练轮数,类型为int,默认值为10000
:return: 模型参数,类型为ndarray
'''
self.theta = np.zeros(x.shape[1])#给theta赋初值,原始值都为0
Iiter = 0
while Iiter < Niters:
gradient = (self.sigmoid(x.dot(self.theta))-y).dot(x)#求当出当前梯度
self.theta = self.theta -eta*gradient #更新theta
Iiter += 1

# 预测函数
def predict(self,x):
'''
:param x: 测试集特征数据,类型为ndarray
:return: 测试结果
'''
a = self.sigmoid(x.dot(self.theta))#通过sigmoid函数,将预测值变为概率值
#当概率值大于0.5时,则置1,反之,置0
return np.array(a >= 0.5, dtype='int')

# 求准确率
def score(label, predict):
'''
:param label: 测试集标签数据,类型为ndarray
:param predict: 预测标签数据,类型为ndarray
'''
label=label.astype(np.int) #将label转换为numpy.int类型
return np.mean(label == predict) #该函数求的是平均值
模型训练
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from LogisticsRegression import *
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
#读取数据,csv文件中最后一列为标签值,其他列都为特征值(这里带入自己的数据即可,注意每个变量代表的含义)
data = pd.read_excel('西瓜.xlsx')

#提取特征值和标签值
X = data.iloc[:,1::-1]
y = data.iloc[:,-1]

#对数据进行标准化
#mean/std可以查一查csdn
X = (X-np.mean(X,axis=0))/np.std(X,axis=0)
#对特征值加一列x0,x0的所有值为1,相当于偏离值b的系数,西瓜书上有
X = np.hstack([np.ones(shape=(len(X),1)),X])

#划分训练集与测试集,参数test_size设为0.2,random_state设为42
#这里借用了机器学习的处理
x_train,x_test,y_train,y_test = train_test_split(X,y,test_size = 0.2,random_state = 42)
#建立模型,并训练模型
Lr = LogisticsRegression()
Lr.GD(x_train,y_train)
#输出的是w1,w2,b三个参数
print("w1,w2,b=",Lr.theta)
#用测试数据集进行预测
predict = Lr.predict(x_test)
print("预测集:",predict)
print("真值:",np.array(y_test))
#评估预测的准确率
score = score(y_test,predict)
print("准确率:",score)

运行结果如下:
![1663928663541.png](https://s2.loli.net/2022/09/23/iANbJHxmt3FLG21.png)
由于数据量比较少,我们的模型还是不错的。
我只是为了完成作业。剩下的等后续实验再补录。