线性回归 - 机器学习多元线性回归 - 一步一步详解 - Python代码实现

目录

数据导入

单变量线性回归

绘制散点图

相关系数R

拆分训练集和测试集

多变量线性回归

数据检验(判断是否可以做线性回归)

训练线性回归模型


先甩几个典型的线性回归的模型,帮助大家捡起那些年被忘记的数学。

单变量线性回归: 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) 

多项式回归始终还是线性回归,你可以令x2=x2^2,x3=x3^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 = u'E:\\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的标准差) == cov(X,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_size=0.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, color="darkgreen", label="train data")#训练集为深绿色点
plt.scatter(X_test, Y_test, color="red", label="test data")#测试集为红色点#添加标签
plt.legend(loc=2)#图标位于左上角,即第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, color='blue', linewidth=2, label="best line")#测试数据散点图
plt.scatter(X_train, Y_train, color='darkgreen', label="train data")
plt.scatter(X_test, Y_test, color='red', label="test data")#添加图标标签
plt.legend(loc=2)#图标位于左上角,即第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 = u'E:\\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_vars='Return', size=7, aspect=0.8, kind='reg')  
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_size=0.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', linewidth=2.5,label="predict data")
plt.plot(range(len(Y_test)),Y_test,'green',label="test data")
plt.legend(loc=2)
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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/475583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Checking battery state… ubuntu

Checking battery state… 当ubuntu启动的时候遇到 “Checking battery state….”时, 按下ctrl alt F1,进入终端,使用管理员权限执行下列代码 sudo rm /etc/X11/xorg.confsudo reboot 转载于:https://www.cnblogs.com/hjslovewcl/archive/2011/06/30/…

层次分析法AHP - 代码注释多 - ( 数据建模 Python代码)

实际生活中,往往有一些很复杂的系统,我们没办法直观草率的确定权重,比如甲、乙、丙三人竞选总统,严谨的说,需要从三人的社交能力、管理能力、经济能力等方面来考虑,在每个方面,三位候选人的得分…

LeetCode 1155. 掷骰子的N种方法(DP)

1. 题目 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, …, f。 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和。 如果需要掷出的总点数为 target,请你计算出有多少种不同的组合情况(所…

Android 之自定义组件

1、如何在一个按钮上放上一张图片&#xff1f;把按钮和图片套在一个FrameLayout中 <!-- 必须将button和ImageView分别嵌套在两个LinearLayout中才能 实现将图片放在按钮上 --> <FrameLayout android:orientation"horizontal" android:layout_width&…

职业规划之后,还需要什么?职业规划与职业选择 - 续集

一时的想法写下&#xff0c;竟没想到会有很多的朋友的共鸣&#xff0c;几天前写下了一则文章&#xff1a;职业规划与职业选择 &#xff0c;写的目的只是自己的心得所绘。很多朋友朋友给我的写作提供了宝贵意见&#xff0c;自己以后也会注意的写作的。但是不免有时候是个人的及时…

LeetCode 1223. 掷骰子模拟(DP)

1. 题目 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数。 不过我们在使用它时有个约束&#xff0c;就是使得投掷骰子时&#xff0c;连续 掷出数字 i 的次数不能超过 rollMax[i]&#xff08;i 从 1 开始编号&#xff09;。 现在&#xff0c;给你一个整数数组 ro…

聚类分析 - K-means - Python代码实现

算法简介 K-means算法是很典型的基于距离的聚类算法&#xff0c;采用距离作为相似性的评价指标&#xff0c;即认为两个对象的距离越近&#xff0c;其相似度就越大。该算法认为簇是由距离靠近的对象组成的&#xff0c;因此把得到紧凑且独立的簇作为最终目标。 算法过程如下&…

安装“消息队列 (MSMQ)”

在 Windows Server 2008 or Windows Server 2008 R2 上安装消息队列 4 在服务器管理器中&#xff0c;单击“功能”。 在“功能摘要”下的右窗格中&#xff0c;单击“添加功能”。 在生成的窗口中&#xff0c;展开“消息队列”。 展开“消息队列服务”。 单击“目录服务集成…

数据归一化 - MinMaxScaler()/MaxAbsScaler() - Python代码

目录 归一化 数据归一化的背景介绍 MinMaxScaler&#xff1a;归一到 [ 0&#xff0c;1 ] MaxAbsScaler&#xff1a;归一到 [ -1&#xff0c;1 ] 标准化 去均值&#xff0c;方差规模化 归一化 数据归一化的背景介绍 在之前做聚类分析的时候我们发现&#xff0c;聚类的…

LeetCode 673. 最长递增子序列的个数(DP)

1. 题目 给定一个未排序的整数数组&#xff0c;找到最长递增子序列的个数。 示例 1: 输入: [1,3,5,4,7] 输出: 2 解释: 有两个最长递增子序列&#xff0c;分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。示例 2: 输入: [2,2,2,2,2] 输出: 5 解释: 最长递增子序列的长度是1&#xff0c;…

loadrunner 配置远程监控windows服务器系统资源

今天决定监控远程windows xp上的系统资源&#xff0c;本来以为应该很好连接&#xff0c;在同一个局域网内&#xff0c;结果出了一堆问题&#xff0c;可能是第一次就让我遇到了一个棘手的操作系统&#xff0c;郁闷&#xff01; &#xff08;1&#xff09;保证装有loadrunner的测…

Python数据清洗 - 洗什么?怎么洗?看完就明白了

目录 缺失值处理 删除缺失值 插补缺失值 不处理缺失值 重复值处理 异常值处理 遍历查找异常值&#xff0c;并根据规则调整大小 删除异常值 视为缺失值后进行插补 数据挖掘过程中&#xff0c;采集的原始数据里存在着各种不利于分析与建模工作的因素&#xff0c;比如数…

LeetCode 1090. 受标签影响的最大值(优先队列)

1. 题目 我们有一个项的集合&#xff0c;其中第 i 项的值为 values[i]&#xff0c;标签为 labels[i]。 我们从这些项中选出一个子集 S&#xff0c;这样一来&#xff1a; |S| < num_wanted对于任意的标签 L&#xff0c;子集 S 中标签为 L 的项的数目总满足 < use_limit…

PHP中的get_defined_funciton和get_defined_vars

1 <?php 2 $zongzi "adfasdf"; 3 //将$zongzi作为数组的key,adfasdf作为数组的值返回 4 $val (get_defined_vars()); 5 echo $val[zongzi]; 6 7 8 function zongzi(){ 9 echo "adfads";10 }11 1…

合并数据 - 合并多个Excel文件并转成CSV - Python代码

在工作中&#xff0c;有时候因为部门间的数据权限问题&#xff0c;推送数据的时候往往是通过邮件完成&#xff0c;对于量大的数据&#xff0c;往往会拆成很多个excel发送&#xff0c;到下一个部门导入数据库之前&#xff0c;总是需要先将所有excel合成一个excel&#xff0c;再导…

LeetCode 524. 通过删除字母匹配到字典里最长单词(双指针)

1. 题目 给定一个字符串和一个字符串字典&#xff0c;找到字典里面最长的字符串&#xff0c;该字符串可以通过删除给定字符串的某些字符来得到。 如果答案不止一个&#xff0c;返回长度最长且字典顺序最小的字符串。如果答案不存在&#xff0c;则返回空字符串。 示例 1: 输入…

poj 3748 位操作

#include<iostream> //位运算using namespace std;int main(){int r,x,y; scanf("%x,%d,%d",&r,&x,&y); rr&(~(1<<x)); rr|(1<<y); rr|(1<<(y-1)); rr&(~(1<<(y-2))); printf("%x\…

Python - Excel文件与CSV文件相互转化

Excel文件转化成CSV - pandas #excel文件转化成csv import pandas as pdfileE:\\pythondata\\union\\test_3.xlsx outfileE:\\pythondata\\union\\test_3.csvdef xlsx_to_csv_pd():data_xls pd.read_excel(file, index_col0)data_xls.to_csv(outfile, encodingutf-8)if __nam…

LeetCode 743. 网络延迟时间(最短路径)

文章目录1. 题目2. 解题2.1 弗洛伊德1. 题目 有 N 个网络节点&#xff0c;标记为 1 到 N。 给定一个列表 times&#xff0c;表示信号经过有向边的传递时间。 times[i] (u, v, w)&#xff0c;其中 u 是源节点&#xff0c;v 是目标节点&#xff0c; w 是一个信号从源节点传递到…

SQL Server T-SQL高级查询

SQL Server T-SQL高级查询&#xff08;转&#xff09; 高级查询在数据库中用得是最频繁的&#xff0c;也是应用最广泛的。 基本常用查询 --select select * from student; --all 查询所有 select all sex from student; --distinct 过滤重复 select distinct sex from student…