因变量Y(或Y1 , …,Yp )与x1 ,x2 ,…,xm的回归方程:

Y=f(x_{1},x_{2},...,x_{m})=a_{0}+a_{1}x_{1}+a_{2}x_{2}+...+a_{m}x_{m}+\varepsilon

数据导入与清洗

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

pd_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
output          0.923985     1.000000

划分训练集和测试集

in

#划分x,y
exam_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_pred
plt.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 

 

 

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐