Sklearn之线性回归实战

  • 一,前言
  • 二,热身例子
  • 三,贸易公司的简单例子
  • 四,Sklearn 官网里的一个例子
  • 五,预测每月的地铁故障数
  • 参考资料

一,前言

一元线性回归的理论片请看我这个链接

二,热身例子

预测直线 y=1x1+2x2+3y = 1x_1 + 2x_2 +3y=1x1​+2x2​+3

导入LinearRegression 从Sklearn.liear_model 包里

from sklearn.linear_model import LinearRegression

拟合数据也可以说是训练

reg = LinearRegression().fit(X, y)

检验正确率

print(reg.score(X, y))

训练的系数,也就是X前面的那个系数,这里打印出 [1. 2.]

print(reg.coef_)

直线的b的系数(其实就是偏置系数), 打印出3

print(reg.intercept_)

完整代码

import numpy as np
from sklearn.linear_model import LinearRegression
X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])
# y = 1 * x_0 + 2 * x_1 + 3
y = np.dot(X, np.array([1, 2])) + 3print(X)
print(y)
reg = LinearRegression().fit(X, y)
print(reg.score(X, y))
print(reg.coef_)
print(reg.intercept_)
print(reg.predict(np.array([[3, 5]])))
[[1 1][1 2][2 2][2 3]]
[ 6  8  9 11]
1.0
[1. 2.]
3.0000000000000018
[16.]

三,贸易公司的简单例子


可见随着广告费用的增加,公司的销售额也在增加,但是它们并非绝对的 线性关系,而是趋向于平均
我们用线性拟合一下这个数据吧。

import numpy as np
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error, r2_scoredata = np.array([[10, 19],[13,60],[22,71],[37,74],[45,69],[48,89],[59,146],[65,130],[66,153],[68,144],[68,128],[71,123],[84,127],[88,125],[89,154],[89,150]])
X = data[:,np.newaxis, 0]
y = data[:,1]print(X)
print(y)
reg = LinearRegression().fit(X, y)
print(reg.score(X, y))
print(reg.coef_)
print(reg.intercept_)
diabetes_y_pred = reg.predict(X)print('Mean squared error: %.2f'  % mean_squared_error(y, diabetes_y_pred))
# The coefficient of determination: 1 is perfect prediction
print('Coefficient of determination: %.2f'  % r2_score(y, diabetes_y_pred))plt.scatter(data[:,0], data[:,1],  color='black')
print('y='+str(reg.coef_[0]) +'*x + ' + str(reg.intercept_) )
plt.plot(data[:,0], reg.coef_*data[:,0] + reg.intercept_, color='blue', linewidth=3)
plt.show()
[[10][13][22][37][45][48][59][65][66][68][68][71][84][88][89][89]]
[ 19  60  71  74  69  89 146 130 153 144 128 123 127 125 154 150]
0.7861129941287246
[1.37939644]
30.637280329657003
Mean squared error: 333.71
Coefficient of determination: 0.79
y=1.37939643679554*x + 30.637280329657003

拟合直线的表达是y=1.37939643679554*x + 30.637280329657003,,其中x表示广告费用,y表示销 售额,通过线性回归的公式就可以预测企业的销售额了。结果还可以 R2 = 0.79

四,Sklearn 官网里的一个例子

diabetes这个数据集一共有442个样本,每个样本有10 个特征。
我们选两个特征用线性来拟合它。


import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score# Load the diabetes dataset
diabetes_X, diabetes_y = datasets.load_diabetes(return_X_y=True)print('diabetes_X', diabetes_X.shape)
print('diabetes_y', diabetes_y.shape)# Use only one feature
diabetes_X = diabetes_X[:, np.newaxis, 2]print('diabetes_X', diabetes_X.shape)# Split the data into training/testing sets
diabetes_X_train = diabetes_X[:-20]
diabetes_X_test = diabetes_X[-20:]# Split the targets into training/testing sets
diabetes_y_train = diabetes_y[:-20]
diabetes_y_test = diabetes_y[-20:]# Create linear regression object
regr = linear_model.LinearRegression()# Train the model using the training sets
regr.fit(diabetes_X_train, diabetes_y_train)# Make predictions using the testing set
diabetes_y_pred = regr.predict(diabetes_X_test)# The coefficients
print('Coefficients: \n', regr.coef_)
# The mean squared error
print('Mean squared error: %.2f' % mean_squared_error(diabetes_y_test, diabetes_y_pred))
# The coefficient of determination: 1 is perfect prediction
print('Coefficient of determination: %.2f'% r2_score(diabetes_y_test, diabetes_y_pred))# Plot outputs
plt.scatter(diabetes_X_test, diabetes_y_test,  color='black')
plt.plot(diabetes_X_test, diabetes_y_pred, color='blue', linewidth=3)plt.xticks(())
plt.yticks(())plt.show()
diabetes_X (442, 10)
diabetes_y (442,)
diabetes_X (442, 1)
Coefficients: [938.23786125]
Mean squared error: 2548.07
Coefficient of determination: 0.47

R2 验证结果是0.47,结果不是很好,不过无所谓,我们就当学习而已,毕竟我们只是选择了10个里面的两个特征。

五,预测每月的地铁故障数

数据大致如下

单独拿出月份,客流量,里程和故障总数
以月份,客流量和里程作为自变量, 故障总数作为因变量。

利用LinearRegression 线性回归预测

from sklearn import linear_model
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as npdef get_dataset():names = ['x1', 'x2', 'x3', 'y']data = pd.read_csv(r'data.csv', names = names)showDiagram(data)return data[['x1', 'x2', 'x3']].values, data['y'].valuesdef showDiagram(data):sns.pairplot(data, x_vars=['x1', 'x2', 'x3'],y_vars='y', kind="reg", size=10, aspect=0.7)plt.show()def test_linearRegression(X, y):clf = linear_model.LinearRegression()reg =clf.fit(X, y)score = reg.score(X, y)print(score)print('linearRegression coef:',clf.coef_)print('linearRegression intercept:',clf.intercept_)y_predict = clf.predict(X)print(y, y_predict)if __name__ == '__main__':X, y = get_dataset()test_linearRegression(X, y)

从下面的图看,其实这三个自变量分布还是有点像线性关系

R2R^2R2的分数是0.7114850794932206,效果还可以。

0.7114850794932206
linearRegression coef: [2.61491083e+01 2.79512124e-06 4.03259299e-01]
linearRegression intercept: -538.3930968535296
[1946 1612 1757 2026 2036 2178 2393 2257 2124 2206 2376 2571 2484 17072209 2306 2703 2270 2705 2539 2445 2453 2457 2652 2543 1935 2144 23802384 2419 3049 3170 2880 2741 2623 2543 2317 1513 1913 2123 2543 2354] [1887.31703211 1748.84437295 2125.8888688  2040.84176181 2143.989443282095.82237877 2199.00616244 2255.54621299 2198.12650347 2275.261404742327.21634395 2431.29334942 2201.08035859 1798.39695835 2343.625160522261.53943342 2380.9654378  2301.93922522 2445.75156989 2484.620465872409.83048515 2523.06818132 2647.09750827 2696.24882068 2425.271339681999.17780785 2543.63183428 2527.83651573 2616.90336563 2503.896556922708.43397888 2694.22790835 2639.08046591 2765.56873537 2888.332025282854.03106174 2234.68253851 1497.37261563 2014.29078913 2190.935568892258.95718537 2400.05226706]

其实还有很多回归算法
GaussianProcessRegressor,AdaBoostRegressor, RandomForestRegressor, DecisionTreeRegressor, ExtraTreesRegressor。

但是有趣的是如果我部分训练集和测试集的话,除了线性回归,其它的都94%-100%.
但是分了训练集和测试集后,在测试集上跑出的结果少的可怜,可能是过拟合了,也可能是数据集太少了。一共才45条的原因,如果哪位大佬懂,欢迎交流一下

代码如下

def get_dataset_by_split():x, y = get_dataset()x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)x_train, x_test, y_train, y_test = np.array(x_train), np.array(x_test), np.array(y_train), np.array(y_test)return x_train, x_test, y_train, y_test
def test_gaussion_by_split(x_train, x_test, y_train, y_test):model = GaussianProcessRegressor()reg = model.fit(x_train, y_train)predict = model.predict(x_test)train_predict = model.predict(x_train)score = reg.score(x_test, y_test)print(score)print(predict, y_test)print(train_predict)
if __name__ == '__main__':x_train, x_test, y_train, y_test = get_dataset_by_split()test_gaussion_by_split(x_train, x_test, y_train, y_test)

预测的结果都是0,真是百思不其解, 这点还是放着以后研究吧。

-50.892299409067995
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [1946 2419 2623 2741 2393 1513 2380 1935 2144 2306 2445 2257 2026]
[2316.99999977 3169.99999968 2353.99999976 2208.99999978 2542.999999752452.99999975 2177.99999978 2651.99999973 1756.99999982 2269.999999772122.99999979 2542.99999975 2205.99999978 2704.99999973 2375.999999761611.99999984 2570.99999974 2483.99999975 2542.99999975 2035.99999982123.99999979 1912.99999981 2702.99999973 2383.99999976 3048.99999972879.99999971 2456.99999975 1706.99999983 2538.99999975]

R² =(1-u/v)。
u=((y_true - y_pred) ** 2).sum() v=((y_true - y_true.mean()) ** 2).sum()
其中y_pred已经在score方法中通过predict()方法得到,再与y_true进行比对。
所以y_true和y_pred越接近,u/v的值越小。
R2的值就越大!

下面是利用scipy计算Pearson系数,和Seaborn显示其值。

from scipy import statsdef pearson(x,y):return stats.pearsonr(x,y)
def showDiagram(data):#g = sns.pairplot(data, x_vars=['x1', 'x2', 'x3'],y_vars='y', kind="reg", size=10, aspect=0.7)g = sns.jointplot(x ='x2', y = 'y',data=data, kind='reg')g.annotate(pearson, template='r: {val:.2f}\np: {p:.3f}')plt.show()

展示Pearson系数,Pearson系数是衡量两个向量之间线性关系紧密程度

1)输入:x为特征,y为目标变量.
2)输出:r: 相关系数 [-1,1]之间,p-value: p值相关系数显著性。
注: p值越小,表示相关系数越显著,一般p值在500个样本以上时有较高的可靠性。

参考资料

[1]https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py
[2] https://www.cnblogs.com/wuliytTaotao/p/10837533.html

[机器学习-回归算法]Sklearn之线性回归实战相关推荐

  1. 机器学习——回归算法

    机器学习–回归算法 一.问题分析 回归问题和分类问题在本质上是一样的,都是针对一个输入做出一个输出预测,其区别在于输出变量的类型. 分类问题也叫离散变量预测,其输出是输入数据所对应的类别,是一种定性输 ...

  2. 机器学习经典算法总结之线性回归

    机器学习经典算法总结之线性回归 最大似然估计(Maximum likelihood Estimate) 在开始我们第一个算法之前呢,先介绍机器学习中一个非常重要的准则,这是一种参数估计的方法--最大似 ...

  3. Python机器学习--回归算法--线性回归

    线性回归算法的类型 有监督学习的回归算法[标签是连续数据类型] 线性回归基础 研究父子身高关系 研究父辈身高(自变量x)如何决定子辈身高(因变量y) 建立方程表征关系:y = kx+b-------- ...

  4. Python机器学习--回归算法--线性回归算法

    线性回归算法 线性回归算法类型: 线性回归算法属于有监督学习的回归算法,可以处理标签为连续数据类型的数据. 线性回归算法原理: 通过寻找特征和标签之间的关系,生成一个线性方程,通过线性方程预测未知标签 ...

  5. scikit-learn机器学习常用算法原理及编程实战(五)

    决策树 决策树是最经典的机器学习模型之一.预测速度快,可以处理类别型数据和连续型数据.通过本章读者可以掌握以下内容: 信息熵及信息增益的概念,以及决策树的分裂的原则: 决策树的创建及剪枝算法: sci ...

  6. 机器学习回归算法—岭回归及案例分析

    一.回归算法之岭回归 具有L2正则化的线性最小二乘法.岭回归是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息.降低精度为代价获 ...

  7. [机器学习-回归算法]一元线性回归用最小二乘法的推导过程

    一元线性回归用最小二乘法的推导过程 在数据的统计分析中,数据之间即变量x与Y之间的相关性研究非常重要,通过在直角坐标系中做散点图的方式我们会发现很多统计数据近似一条直线,它们之间或者正相关或者负相关. ...

  8. 机器学习回归算法—性能评估欠拟合与过拟合

    机器学习中的泛化,泛化即是,模型学习到的概念在它处于学习的过程中时模型没有遇见过的样本时候的表现.在机器学习领域中,当我们讨论一个机器学习模型学习和泛化的好坏时,我们通常使用术语:过拟合和欠拟合.我们 ...

  9. 2019最新《小象学院Python机器学习和算法高级版项目实战》

    ├─00.课程介绍 │      <机器学习·升级版II>常见问题FAQ - 小象问答-hadoop,spark,storm,R,hi.jpg │      <机器学习>升级版 ...

最新文章

  1. 调研 | 大数据师资培训,你想学哪门课、有哪些意见?
  2. 在 Mac OS X 上安装 TensorFlow
  3. Web 上一页下一页 用超链接 用按钮
  4. KMP字符串模式匹配详解
  5. sizeof()使用注意
  6. JMS学习十 ActiveMQ支持的传输协议
  7. sublime text3 插件安装
  8. JS正则验证邮箱的格式
  9. java读写文件操作
  10. 浪潮“151计划”:信息安全 没有“偏远地区”
  11. 小程序源码:独立后台带分销功能月老办事处交友盲盒
  12. t分布 u分布 卡方分布_三大抽样分布:卡方分布,t分布和F分布的简单理解
  13. 利用记事本编写html代码和word实现A4信笺纸(信签纸)电子版的两种设计法
  14. python考勤统计_公司HR统计考勤用这个函数公式,快速、准确完成,再也不加班了...
  15. 2016年腾讯实习生校园招聘-电面
  16. 使用meshBaker合并多个mesh进行优化
  17. 无线Beacon帧解析
  18. 2B市场行业,面向2025年技术趋势与5大机会,赶快来看一看吧
  19. linux系统tar命令慢,Linux系统下tar命令的使用技巧
  20. 粒子寻优算法PSO学习笔记

热门文章

  1. SRM 625 DIV2
  2. 004 classmates subject
  3. MySQL 删除大表的性能问题
  4. Spring的事务管理难点剖析(4):多线程的困惑
  5. 清除SVOHOST.EXE的方法
  6. 文昌帝君 -- 《文昌帝君阴骘文》
  7. 前端面试:你应该了解的JS算法相关的知识
  8. VSCode 调试 Egg 完美版 - 进化史 #25
  9. 使用PostgREST的RestAPI操作之相关软件生态系统
  10. 容器编排技术 -- Kubernetes kubectl rollout resume 命令详解