因变量Y(或Y1 , …,Yp )与x1 ,x2 ,…,xm的回归方程:
数据导入与清洗
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 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
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