线性回归LinearRegression
回归Regression是监督学习的一个重要问题,回归用于预测输入变量和输出变量之间的关系,特别是当输入变量的值发生变化时,输出变量的值也随之发生变化。回归模型正是表示从输入变量到输出变量之间映射的函数。
线性回归模型定义为:
f
(
x
)
=
w
0
+
w
1
x
1
+
w
2
x
2
+
.
.
.
+
w
n
x
n
f(x) = w_0+w_1x_1+w_2x_2+...+w_nx_n
f(x)=w0+w1x1+w2x2+...+wnxn
矩阵形式:
f
(
x
)
=
X
W
f(x)=XW
f(x)=XW
线性回归模型的目标就是找到一系列参数 w w w来使得 f ( x ) = X W f(x)=XW f(x)=XW尽可能地贴近 y y y。
import numpy as np
import matplotlib.pyplot as plt
# 定义真实函数
def true_fun(X):
return 1.5*X + 0.2
np.random.seed(0) # 生成随机数种子
n_samples = 30 # 设置采样数据点的个数
X_train = np.sort(np.random.rand(n_samples)) # 生成随机数作为训练集
y_train = (true_fun(X_train) + np.random.randn(n_samples) * 0.05).reshape(n_samples,1) # 添加噪声
from sklearn.linear_model import LinearRegression # 从sklearn库中导入线性回归模型
model = LinearRegression() # 定义模型
model.fit(X_train[:, np.newaxis], y_train) # 训练模型
print("输出参数w:", model.coef_) # 参数权重w
print("输出参数b:", model.intercept_) # 参数偏置b
X_test = np.linspace(0,1,100)
plt.plot(X_test, model.predict(X_test[:, np.newaxis]), label="Model") # 绘制折线图
plt.plot(X_test, true_fun(X_test), label="Model")
plt.scatter(X_train, y_train) # 散点图
plt.legend(loc="best") # 设置图例位置
plt.savefig('./test.jpg') # 保存图片
plt.show()
输出结果:
逻辑回归LogisticRegression
线性回归与非线性回归其输出都是连续的。
逻辑回归可看作二元分类问题,其输出是二元离散的。
在scikit-learn中,与逻辑回归相关的主要包括LogisticRegression、LogisticRegressionCV 和logistic_regression_path这3个类。
正则化选择参数:penalty
LogisticRegression和LogisticRegressionCV默认就带了正则化项。penalty参数可选择的值为”l1”和”l2”,分别对应L1的正则化和L2的正则化,默认是L2的正则化。
在调参时如果主要的目的只是为了解决过拟合,一般penalty选择L2正则化即可。但是如果选择L2正则化发现还是过拟合,即预测效果差的时候,就可以考虑L1正则化。另外,如果模型的特征非常多,我们希望一些不重要的特征系数归零,从而让模型系数稀疏化的话,也可以使用L1正则化。
penalty:惩罚项,str类型,可选参数为l1和l2,默认为l2。用于指定惩罚项中使用的规范。newton-cg、sag和lbfgs求解算法只支持L2规范。
L1规范假设的是模型的参数满足拉普拉斯分布,L2假设的模型参数满足高斯分布,所谓的范式就是加上对参数的约束,使得模型不会过拟合(overfit)。
优化算法选择参数:solver
solver参数决定了对逻辑回归损失函数的优化方法,有4种算法可以选择,分别是:
a. liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数。
b. lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵(Hessian Matrix)来迭代优化损失函数。
c. newton-cg:也是牛顿法组的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
d. sag:即随机平均梯度下降(Stochastic averaged gradient descent),是梯度下降法(Gradient descent)的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。其次,saga是线性收敛的随机优化算法的变种。
import sys
from pathlib import Path
curr_path = str(Path().absolute()) # 当前文件所在绝对路径
parent_path = str(Path().absolute().parent) # 父路径
sys.path.append(parent_path) # 添加路径到系统路径
from Mnist.load_data import load_local_mnist # 此脚本提供本地载入Mnist数据集的方法
from sklearn.linear_model import LogisticRegression # 导入sklearn线性模型中的LogisticRegression逻辑回归类
from sklearn.metrics import classification_report # 分类报告(分类模型评估):用于显示主要分类指标的文本报告。在报告中显示每个类的精确度、召回率、F1值等信息。
(X_train, y_train), (X_test, y_test) = load_local_mnist(normalize=False, one_hot=False) # 加载本地MNIST数据集
X_train, y_train = X_train[:2000], y_train[:2000] # 通过冒号分隔切片参数 start:stop:step 来进行切片操作作为训练集,0~2000
X_test, y_test = X_test[:200], y_test[:200]
# 优化算法参数solver:即使用的优化器。如:lbfgs:拟牛顿法, sag:随机梯度下降
model = LogisticRegression(solver='lbfgs', max_iter=500)
model.fit(X_train, y_train) # train model
y_pred = model.predict(X_test) # 使用测试集预测结果
print(classification_report(y_test,y_pred)) # 打印分类报告
运行结果:
补充
sklearn.metrics.classification_report(y_true, y_pred, labels=None, target_names=None, sample_weight=None, digits=2, output_dict=False)
y_true:1 维数组,真实数据的分类标签
y_pred:1 维数组,模型预测的分类标签
labels:列表,需要评估的标签名称
target_names:列表,指定标签名称
sample_weight:1 维数组,不同数据点在评估结果中所占的权重
digits:评估报告中小数点的保留位数,如果 output_dict=True,此参数不起作用,返回的数值不作处理
output_dict:若真,评估结果以字典形式返回
返回
字符串或字典。
每个分类标签的精确度、召回率和 F1-score。
精确度:precision,正确预测为正的,占全部预测为正的比例,TP / (TP+FP)
召回率:recall,正确预测为正的,占全部实际为正的比例,TP / (TP+FN)
F1-score:精确率和召回率的调和平均数,2 * precision*recall / (precision+recall)