因变量Y(或Y1 , …,Yp )与x1 ,x2 ,…,xm的回归方程:
数据导入与清洗
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_splitfrom sklearn.linear_model import LinearRegressionpd_data = pd.read_csv("xxxx.csv") #可用read_csv导入数据
利用numpy和pandas对数据进行操作
利用matplotlib将数据图像化
利用sklearn导入数据集训练和模型
多元线性回归
#清洗不需要的数据new_pd_data = pd_data.ix[:,1:]#数据描述print(new_pd_data.describe())#缺失值检验print(new_pd_data[new_pd_data.isnull()==True].count())#R方检测#决定系数r平方#对于评估模型的精确度#y误差平方和 = Σ(y实际值 - y预测值)^2#y的总波动 = Σ(y实际值 - y平均值)^2#有多少百分比的y波动没有被回归拟合线所描述 = SSE/总波动#有多少百分比的y波动被回归线描述 = 1 - SSE/总波动 = 决定系数R平方#对于决定系数R平方来说#1) 回归线拟合程度:有多少百分比的y波动刻印有回归线来描述(x的波动变化)#2)值大小:R平方越高,回归模型越精确(取值范围0~1),1无误差,0无法完成拟合
数据清洗、预测等与简单线性回归类似
简单线性回归
创建简单模型
in
#创建数据集examDict = {'worktime':[0.50,0.75,1.00,1.25,1.50,1.75,1.75,2.00,2.25,2.50,2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50],'output':[10,22,13,43,20,22,33,50,62,48,55,75,62,73,81,76,64,82,90,93]}#转换为DataFrame的数据格式examDF = pd.DataFrame(examDict)
out
worktime output
0 0.50 10
1 0.75 22
2 1.00 13
3 1.25 43
4 1.50 20
5 1.75 22
6 1.75 33
7 2.00 50
8 2.25 62
9 2.50 48
10 2.75 55
11 3.00 75
12 3.25 62
13 3.50 73
14 4.00 81
15 4.25 76
16 4.50 64
17 4.75 82
18 5.00 90
19 5.50 93
图像化
in
#绘制散点图plt.scatter(examDF.worktime,examDF.output,color = 'g',label = "Exam Data")#添加图的标签(x轴,y轴)plt.xlabel("worktime")plt.ylabel("output")#显示图像plt.show()
out
pandas中可反应数据间相关性的函数obj.corr() (参数为空时,默认使用的参数为pearson)
corr( )有三种用法:
1.pearson:衡量两个数据集合是否在一条线上面
即针对线性数据的相关系数计算,针对非线性数据便会有误差。
2.spearman:非线性的,非正态分析的数据的相关系数
3.kendall:用于反映分类变量相关性的指标,即针对无序序列的相关系数,非正态分布的数据
in
rDF = examDF.corr(method = "pearson")print(rDF)
out
worktime output
worktime 1.000000 0.923985
output0.923985 1.000000
划分训练集和测试集
in
#划分x,yexam_X=examDF[["worktime"]] exam_Y= examDF[["output"]]#将原数据集拆分训练集和测试集X_train,X_test,Y_train,Y_test = train_test_split(exam_X,exam_Y,train_size=.8)#X_train为训练数据,X_test为测试数据,exam_X为样本特征,exam_y为样本标签,train_size 训练数据占比# print("原始数据特征:",exam_X.shape,# ",训练数据特征:",X_train.shape,# ",测试数据特征:",X_test.shape)# print("原始数据标签:",exam_Y.shape,# ",训练数据标签:",Y_train.shape,# ",测试数据标签:",Y_test.shape)#线性回归模型model = LinearRegression() #线性回归模型model.fit(X_train,Y_train) #模型的成员函数fit(X,y)以数组X和y为输入a = model.intercept_ #截距 判断是否有截据,如果没有则直线过原点b = model.coef_ #回归系数 模型的成员变量,存储线性模型的系数#训练数据预测值y_train_pred = model.predict(X_train) #预测score = model.score(X_test,Y_test) #可决系数 返回对于以X为samples,以y为target的预测效果评分
out
截距: [9.19829213]
回归系数: [[15.80379307]]
预测: [[48.55501931]
[31.77509653]
[44.36003861]
[35.97007722]
[23.38513514]
[90.50482625]
[82.11486486]
[65.33494208]
[56.94498069]
[61.13996139]
[73.72490347]
[35.97007722]
[14.99517375]
[52.75 ]
[98.89478764]
[27.58011583]]
评分: 0.6983823980938839
原始数据特征: (20, 1) ,训练数据特征: (16, 1) ,测试数据特征: (4, 1)
原始数据标签: (20, 1) ,训练数据标签: (16, 1) ,测试数据标签: (4, 1)
train_test_split函数
train_test_split(train_data,train_target,test_size=0.4, random_state=0,stratify=y_train)
train_data:所要划分的样本特征集
train_target:所要划分的样本结果
①若为浮点时,表示训练集占总样本的百分比
②若为整数时,表示训练样本的样本数
③若为None时,train_size自动被设置成0.75
test_size:样本占比(可以为浮点、整数或None,默认为None)
①为浮点,表示测试集占总样本的百分比
②为整数,表示测试样本的样本数
③为None,test_size自动设置成0.25
random_state:随机数种子(该组随机数的编号,在需要重复试验的时候,保证得到一组
一样的随机数,比如填1,在其他参数一样的情况下所得随机数组是一样的)
stratify:保持split前类的分布,=X就是按照X中的比例分配 ,=y就是按照y中的比例分配
①为None,划分出来的测试集或训练集中,其类标签的比例是随机的
②不为None,划分出来的测试集或训练集中,其类标签的比例同输入的数组中类标签的比例相同,可以用于处理不均衡的数据集
train-test散点图
in
#散点图plt.scatter(X_train, Y_train, color="blue", label="train data")plt.scatter(X_test, Y_test, color="yellow", label="test data")#添加图标标签plt.legend(loc=2)plt.xlabel("Hours")plt.ylabel("Pass")#显示图像plt.show()
out
最佳拟合线+测试数据散点图
in
#绘制最佳拟合线:标签用的是训练数据的预测值y_train_predplt.plot(X_train, y_train_pred, color='black', linewidth=3, label="best line")#测试数据散点图plt.scatter(X_test, Y_test, color='red', label="test data")plt.scatter(X_train, Y_train, color='green', label="train data")#添加图标标签plt.legend(loc=2)plt.xlabel("worktime")plt.ylabel("output")#显示图像plt.show()
out
如果觉得《多元统计分析 多元线性回归 python代码实现 简单线性回归》对你有帮助,请点赞、收藏,并留下你的观点哦!