做网站视频网站,用手机网站做app,在网站做推广要钱吗,网站建设公司的服务器目录
数据导入
单变量线性回归
绘制散点图
相关系数R
拆分训练集和测试集
多变量线性回归
数据检验#xff08;判断是否可以做线性回归#xff09;
训练线性回归模型 先甩几个典型的线性回归的模型#xff0c;帮助大家捡起那些年被忘记的数学。
● 单变量线性回归判断是否可以做线性回归
训练线性回归模型 先甩几个典型的线性回归的模型帮助大家捡起那些年被忘记的数学。
● 单变量线性回归 h(x)theta0 theta1* x 1 ● 多变量线性回归 h(x)theta0 theta1* x 1 theta2* x 2 theta3* x 3 ● 多项式回归 h(x)theta0 theta1* x 1 theta2* (x2^2) theta3* (x3^3)
多项式回归始终还是线性回归你可以令x2x2^2x3x3^3简单的数据处理一下就好了这样上述多项式回归的模型就变成多变量线性回归的模型了。
数据导入
下面我们要开始用数据说话了先来看看数据源是什么样子吧。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pandas import DataFrame,Series
from sklearn.cross_validation import train_test_split
from sklearn.linear_model import LinearRegression#读取文件
datafile uE:\\pythondata\\dhdhdh.xlsx#文件所在位置u为防止路径中有中文名称此处没有可以省略
data pd.read_excel(datafile)#datafile是excel文件所以用read_excel,如果是csv文件则用read_csv
examDf DataFrame(data)
examDf.head() 运行结果 Call Connect Return
0 2.1335 1.267760 1.176615
1 2.5534 1.352941 1.978967
2 3.3361 1.872093 2.249511
3 3.3861 1.826667 2.986597
4 3.9682 1.875000 2.798570 单变量线性回归 绘制散点图
先将上述数据中的Connect接通量和Return回款量做一个单变量的线性回归先绘制一个散点图大致看一下分布情况。
#绘制散点图,examDf.jt为X轴examDf.hk为Y轴
plt.scatter(examDf.Connect,examDf.Return,color darkgreen,label Exam Data)#添加图的标签x轴y轴
plt.xlabel(The Connection amount of the average account)#设置X轴标签
plt.ylabel(The ratio of average return amount)#设置Y轴标签
plt.show()#显示图像 运行结果 看来商业中的实际数据总是和课本上的完美数据不一样看这零零散散的分布线性关系很是勉强但是大致还是有一个线性相关的样子的那么就看看相关系数有多少吧。
相关系数R
rDf examDf.corr()#查看数据间的相关系数
print(rDf) 运行结果 Call Connect Return
Call 1.000000 0.445870 0.441673
Connect 0.445870 1.000000 0.745338
Return 0.441673 0.745338 1.000000 Connect接通量和Return回款量的相关系数为0.745338还不错。
相关系数是用以反映变量之间相关关系密切程度的统计指标对于相关性强度来说我们一般认为
0~0.3 弱相关
0.3~0.6 中等程度相关
0.6~1 强相关
在数学中相关系数的计算一般是这样的给数学狂人看 R(相关系数) X和Y的协方差 / (X的标准差 * Y的标准差) covX,Y/ σX * σY 即person系数 拆分训练集和测试集
Connect接通量和Return回款量属于强相关可以进行线性回归训练那么我们先来拆分训练集和测试集吧。
#拆分训练集和测试集train_test_split是存在与sklearn中的函数
X_train,X_test,Y_train,Y_test train_test_split(examDf.Connect,examDf.Return,train_size0.8)
#train为训练数据,test为测试数据,examDf为源数据,train_size 规定了训练数据的占比print(自变量---源数据:,examDf.Connect.shape, 训练集:,X_train.shape, 测试集:,X_test.shape)
print(因变量---源数据:,examDf.Return.shape, 训练集:,Y_train.shape, 测试集:,Y_test.shape)#散点图
plt.scatter(X_train, Y_train, colordarkgreen, labeltrain data)#训练集为深绿色点
plt.scatter(X_test, Y_test, colorred, labeltest data)#测试集为红色点#添加标签
plt.legend(loc2)#图标位于左上角即第2象限类似的1为右上角3为左下角4为右下角
plt.xlabel(The Connection amount of the average account)#添加 X 轴名称
plt.ylabel(The ratio of average return amount)#添加 Y 轴名称
plt.show()#显示散点图 运行结果 自变量---源数据: (14,) 训练集: (11,) 测试集: (3,)
因变量---源数据: (14,) 训练集: (11,) 测试集: (3,)回归模型训练
#调用线性规划包
model LinearRegression()#线性回归训练
model.fit(X_train,Y_train)#调用线性回归包a model.intercept_#截距
b model.coef_#回归系数#训练数据的预测值
y_train_pred model.predict(X_train)
#绘制最佳拟合线标签用的是训练数据的预测值y_train_pred
plt.plot(X_train, y_train_pred, colorblue, linewidth2, labelbest line)#测试数据散点图
plt.scatter(X_train, Y_train, colordarkgreen, labeltrain data)
plt.scatter(X_test, Y_test, colorred, labeltest data)#添加图标标签
plt.legend(loc2)#图标位于左上角即第2象限类似的1为右上角3为左下角4为右下角
plt.xlabel(The Connection amount of the average account)#添加 X 轴名称
plt.ylabel(The ratio of average return amount)#添加 Y 轴名称
plt.show()#显示图像print(拟合参数:截距,a,,回归系数,b)
print(最佳拟合线: Y ,round(a,2),,round(b[0],2),* X)#显示线性方程并限制参数的小数位为两位运行结果 拟合参数:截距 -0.7291766860887745 ,回归系数 [1.71584366]
最佳拟合线: Y -0.73 1.72 * X 补充一句有博友说单变量线性回归上面的这段代码中加一个reshape就能运行出来了可能是版本不同我没加也能运行出来所以分享在下面给大家参考一下如果有和博友一样的情况可以试试增加下面一段代码谢谢博友 dsy23 的分享 #调用线性规划包
model LinearRegression()#在这里加一段
X_train X_train.values.reshape(-1,1)
X_test X_test.values.reshape(-1,1)#线性回归训练
model.fit(X_train,Y_train)#调用线性回归包a model.intercept_#截距
b model.coef_#回归系数 多变量线性回归
在单变量线性回归中我们将每一步都讲解的极其详细所以在多变量线性回归中我们不会重复讲那些简单的部分了但是为了防止python小白迷失自己所以在这部分该有的代码还是会甩出来该有的备注也都有只不过不会一点一点分步骤来了。
上面我们提到多变量线性回归的模型为h(x)theta0 theta1* x 1 theta2* x 2 theta3* x 3下面我们还是使用单变量线性回归中的数据单变量线性回归中我们只用到了Connect接通量和Return回款量既然是多变量回归模型那么我们就多加一个变量Call拨打量。 数据检验判断是否可以做线性回归
#-*- coding:utf-8 -*- import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from pandas import DataFrame,Series
from sklearn.cross_validation import train_test_split
from sklearn.linear_model import LinearRegression#读取文件
datafile uE:\\pythondata\\dhdhdh.xlsx#文件所在位置u为防止路径中有中文名称此处没有可以省略
data pd.read_excel(datafile)#datafile是excel文件所以用read_excel,如果是csv文件则用read_csv
examDf DataFrame(data)#数据清洗,比如第一列有可能是日期这样的话我们就只需要从第二列开始的数据
#这个情况下把下面中括号中的0改为1就好要哪些列取哪些列
new_examDf examDf.ix[:,0:]#检验数据
print(new_examDf.describe())#数据描述会显示最值平均数等信息可以简单判断数据中是否有异常值
print(new_examDf[new_examDf.isnull()True].count())#检验缺失值若输出为0说明该列没有缺失值#输出相关系数判断是否值得做线性回归模型
print(new_examDf.corr())#0-0.3弱相关0.3-0.6中相关0.6-1强相关#通过seaborn添加一条最佳拟合直线和95%的置信带直观判断相关关系
sns.pairplot(data, x_vars[Call,Connect], y_varsReturn, size7, aspect0.8, kindreg)
plt.show()运行结果 Call Connect Return
count 99.000000 99.000000 99.000000
mean 3.153649 1.967779 2.591121
std 1.027607 0.470364 0.790172
min 1.280100 1.014208 0.941292
25% 2.373528 1.596610 2.044147
50% 3.040000 1.913472 2.476091
75% 3.835980 2.253994 3.035603
max 5.851181 3.234977 5.160840
Call 0
Connect 0
Return 0
dtype: int64Call Connect Return
Call 1.000000 0.837052 0.744792
Connect 0.837052 1.000000 0.844640
Return 0.744792 0.844640 1.000000判断是否可以做线性回归
异常值通过最值或者平均数或者中位数等判断或者直接通过查看是否有游离在大部队之外的点来判断是否有异常值空值这个没办法你必须看运行结果的10-12行是否等于0是0则无空值如果不是0就要看看是删掉空值呢还是用其他值代替呢不同情况不同对待相关性要么通过相关系数的大小判断要么看散点图中的最佳拟合直线和95%的置信带直观判断相关关系训练线性回归模型
#拆分训练集和测试集
X_train,X_test,Y_train,Y_test train_test_split(new_examDf.ix[:,:2],new_examDf.Return,train_size0.8)
#new_examDf.ix[:,:2]取了数据中的前两列为自变量此处与单变量的不同print(自变量---源数据:,new_examDf.ix[:,:2].shape, 训练集:,X_train.shape, 测试集:,X_test.shape)
print(因变量---源数据:,examDf.Return.shape, 训练集:,Y_train.shape, 测试集:,Y_test.shape)#调用线性规划包
model LinearRegression()model.fit(X_train,Y_train)#线性回归训练a model.intercept_#截距
b model.coef_#回归系数
print(拟合参数:截距,a,,回归系数,b)#显示线性方程并限制参数的小数位为两位
print(最佳拟合线: Y ,round(a,2),,round(b[0],2),* X1 ,round(b[1],2),* X2)Y_pred model.predict(X_test)#对测试集数据用predict函数预测plt.plot(range(len(Y_pred)),Y_pred,red, linewidth2.5,labelpredict data)
plt.plot(range(len(Y_test)),Y_test,green,labeltest data)
plt.legend(loc2)
plt.show()#显示预测值与测试值曲线运行结果 自变量---源数据: (99, 2) 训练集: (79, 2) 测试集: (20, 2)
因变量---源数据: (99,) 训练集: (79,) 测试集: (20,)
拟合参数:截距 -0.006540954521370601 ,回归系数 [0.08624344 1.19029593]
最佳拟合线: Y -0.01 0.09 * X1 1.19 * X2 效果勉强满意毕竟才用了80个数训练的模型要求高的话多用一些数据就好。
除了用 Python 做线性回归我们还可以使用 SPSS 来做不用编程不用各种调参就是点几下就可以输出结果更简便具体操作请参考下面链接里的文章
数据建模 - SPSS做多元线性回归 - 分析步骤、输出结果详解、与Python的结果对比 -SPSS