[机器学习与scikit-learn-29]:算法-回归-普通线性回归LinearRegression拟合线性分布数据的代码示例

Posted 文火冰糖的硅基工坊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[机器学习与scikit-learn-29]:算法-回归-普通线性回归LinearRegression拟合线性分布数据的代码示例相关的知识,希望对你有一定的参考价值。

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客

本文网址:


目录

第1章 LinearRegression类说明

第2章 LinearRegression使用的代码示例

2.1 导入库

2.2 导数数据集

2.3 分割数据集

2.4 建立模型与进行训练

2.5 MSE、MAE评估

2.6 R2评估

2.7 模型指标分析


第1章 LinearRegression类说明

  • fit_intercept: y = kx + b,b就是截距,这里指定是否需要带参数。
  • normalize:是否需要对数据进行中心化。
  • copy_X:是否需要对X样本进行拷贝,当使用normalize时,是否需要覆盖输入样本。

线性回归的类可能是最简单的类,仅有四个参数就可以完成一个完整的算法。

并且看得出,这些参数中并没有一个是必填的,都有默认值,更没有对我们的模型有不可替代作用的超参数。

这说明,线性回归的性能,往往取决于数据本身,并没有可以调整的模型的超参数,线性回归也因此对数据有着很高的要求。

幸运的是,现实中大部分连续型变量之间,都存在着或多或少的线性联系。所以线性回归虽然简单,却很强大。
同时,sklearn中的线性回归可以处理多标签问题,只需要在fit的时候输入多维度标签就可以了。

备注:

本文的重点放在用线性模型拟合线性分布的多维度数据。

第2章 LinearRegression使用的代码示例

2.1 导入库

#1.导入库
from sklearn.linear_model import LinearRegression as LR
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.datasets import fetch_california_housing as fch #加利福尼亚房屋价值数据集
import pandas as pd

2.2 导数数据集

#2. 导入数据集
housevalue = fch() #会需要下载,大家可以提前运行试试看
X = pd.DataFrame(housevalue.data) #放入DataFrame中便于查看
y = housevalue.target
print(X.shape)
print(y.shape)

print(X.head())
print(housevalue.feature_names)
X.columns = housevalue.feature_names
X.columns
"""
MedInc:该街区住户的收入中位数
HouseAge:该街区房屋使用年代的中位数
AveRooms:该街区平均的房间数目
AveBedrms:该街区平均的卧室数目
Population:街区人口
AveOccup:平均入住率
Latitude:街区的纬度
Longitude:街区的经度
"""

# 打印排序后的样本标签值
plt.plot(range(len(y)) ,sorted(y) )
(20640, 8)
(20640,)
        0     1         2         3       4         5      6       7
0  8.3252  41.0  6.984127  1.023810   322.0  2.555556  37.88 -122.23
1  8.3014  21.0  6.238137  0.971880  2401.0  2.109842  37.86 -122.22
2  7.2574  52.0  8.288136  1.073446   496.0  2.802260  37.85 -122.24
3  5.6431  52.0  5.817352  1.073059   558.0  2.547945  37.85 -122.25
4  3.8462  52.0  6.281853  1.081081   565.0  2.181467  37.85 -122.25
['MedInc', 'HouseAge', 'AveRooms', 'AveBedrms', 'Population', 'AveOccup', 'Latitude', 'Longitude']

房价有最低值和最高值.

2.3 分割数据集

#3. 分割数据集
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X,y,test_size=0.3,random_state=420)
for i in [Xtrain, Xtest]:
    i.index = range(i.shape[0])

print(X.shape)
print(Xtrain.shape)
print(Xtest.shape)
(20640, 8)
(14448, 8)
(6192, 8)

2.4 建立模型与进行训练

#4. 建立模型并进行训练
model = LR()
model = model.fit(Xtrain, Ytrain)

# 模型预测
Y_pred = model.predict(Xtest)
print("预测值:", Y_pred)

# 训练好的模型参数: y = k*x + b
print("训练好的模型参数:")
print("截距b的值 :", model.intercept_)
print("特征权重系数K的值:", model.coef_)

# 模型特征权重值与特征的名称组合起来
[*zip(Xtrain.columns,model.coef_)]
预测值: [1.51384887 0.46566247 2.2567733  ... 2.11885803 1.76968187 0.73219077]
训练好的模型参数:
截距b的值 : -36.25689322920384
特征权重系数K的值: [ 4.37358931e-01  1.02112683e-02 -1.07807216e-01  6.26433828e-01
  5.21612535e-07 -3.34850965e-03 -4.13095938e-01 -4.26210954e-01]
预测值: [1.51384887 0.46566247 2.2567733  ... 2.11885803 1.76968187 0.73219077]
训练好的模型参数:
截距b的值 : -36.25689322920384
特征权重系数K的值: [ 4.37358931e-01  1.02112683e-02 -1.07807216e-01  6.26433828e-01
  5.21612535e-07 -3.34850965e-03 -4.13095938e-01 -4.26210954e-01]

Out[26]:

[('MedInc', 0.4373589305968406),
 ('HouseAge', 0.010211268294493916),
 ('AveRooms', -0.1078072161731777),
 ('AveBedrms', 0.6264338275363787),
 ('Population', 5.216125353122233e-07),
 ('AveOccup', -0.003348509646333547),
 ('Latitude', -0.41309593789477145),
 ('Longitude', -0.4262109536208467)]
备注:影响房价的主要因素为:

('AveBedrms', 0.6264338275363787),   # 房间数

[('MedInc', 0.4373589305968406),         # 该街区住户的收入中位数

2.5 MSE、MAE评估

# 5. MSE评估指标
import sklearn
from sklearn.metrics import mean_squared_error as MSE

mse_score = MSE(Y_pred, Ytest)
print("均分误差MSE=", mse_score)
print("预测最大值:", Y_pred.max())
print("预测最小值:", Y_pred.min())
print("标签最大值:", y.max())
print("标签最小值:", y.min())

# 对训练好的模型进行交叉验证
# cv=交叉验证的次数
# scoring:打分指标:neg_mean_squared_error, 
# 在sklearn交叉验证中,损失/误差都是用负数表示,去掉负号,就是它的均分误差值
# 负号:表示损失!!!
mse_score = cross_val_score(model, X,y,cv=5, scoring="neg_mean_squared_error")
print("交叉验证的MSE=", mse_score)

mse_score = cross_val_score(model, X,y,cv=5, scoring="neg_mean_absolute_error")
print("交叉验证的MAE=", mse_score)

# 打印有哪些评估指标
sorted(sklearn.metrics.SCORERS.keys())
均分误差MSE= 0.5309012639324571
预测最大值: 7.146198214270875
预测最小值: -0.6528439725036179
标签最大值: 5.00001
标签最小值: 0.14999
交叉验证的MSE= [-0.48485857 -0.62249739 -0.64621047 -0.5431996  -0.49468484]
交叉验证的MAE= [-0.54599439 -0.5661782  -0.57654952 -0.53190614 -0.5168527 ]

2.6 R2评估

# 6. R2评估指标: 反应了模型准确性的指标
# R2的值越接近1,模型的准确性越好
# R2的值越接近0,模型的准确性越差
from sklearn.metrics import r2_score
r2 = r2_score(Ytest,Y_pred)
print("r2=",r2)

r2 = model.score(Xtest,Ytest)
print("r2=",r2)
r2= 0.6043668160178817
r2= 0.6043668160178817

备注:

R2越接近1,指标越好

0.6左右的R2指标不算好,

2.7 模型指标分析

# 查找指标不好的原因
import matplotlib.pyplot as plt
print("Ytest.min", Ytest.min())
print("Ytest.max", Ytest.max())
print("Y_pred.min", Y_pred.min())
print("Y_pred.max", Y_pred.max())
plt.plot(range(len(Ytest)) ,sorted(Ytest), c="black",label= "Data")
plt.plot(range(len(Y_pred)),sorted(Y_pred),c="red",  label = "Predict")
plt.legend()
plt.show()
### 备注
# 预测值的走势与样本标签值的走势在界限范围内基本相似
# 预测值在两边的边界相差较大,预测值会趋于正无穷和负无穷
# 而标签样本中的数值是有上限制与下限
Ytest.min 0.14999
Ytest.max 5.00001
Y_pred.min -0.6528439725036179
Y_pred.max 7.146198214270875


作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客

本文网址:

以上是关于[机器学习与scikit-learn-29]:算法-回归-普通线性回归LinearRegression拟合线性分布数据的代码示例的主要内容,如果未能解决你的问题,请参考以下文章

包邮送书啦|《机器学习与深度学习算法基础》

机器学习机器学习入门02 - 数据拆分与测试&算法评价与调整

Python3入门机器学习 经典算法与应用

《分布式机器学习:算法理论与实践》——RE

Python3入门机器学习--经典算法与应用|Python3机器学习

从入门到精通:机器学习算法与应用