600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 多元统计分析 多元线性回归 python代码实现 简单线性回归

多元统计分析 多元线性回归 python代码实现 简单线性回归

时间:2024-06-08 21:54:36

相关推荐

多元统计分析 多元线性回归 python代码实现 简单线性回归

因变量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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。