您的位置:首页 > 编程语言 > Python开发

简单线性回归学习

2018-04-03 11:15 441 查看
简单线性回归

from collections import OrderedDict
import pandas as pd


#数据集
examDict={
'学习时间':[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],
'分数':    [10,  22,  13,  43,  20,  22,  33,  50,  62,
48,  55,  75,  62,  73,  81,  76,  64,  82,  90,  93]
}
examOrderDict=OrderedDict(examDict)
examDf=pd.DataFrame(examOrderDict)


examDf.head()


学习时间分数
00.5010
10.7522
21.0013
31.2543
41.5020
#提取特征和标签
#特征features
exam_X=examDf.loc[:,'学习时间']
#标签labes
exam_Y=examDf.loc[:,'分数']


#绘制散点图
import matplotlib.pyplot as plt

plt.scatter(exam_X,exam_Y,color='b',label='exam data')
plt.xlabel('Hours')
plt.ylabel('Score')
plt.show()


![这里写图片描述](https://img-blog.csdn.net/20180403111119874?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva3Q1MTMyMjY3MjQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

'''
train_test_split是交叉验证中常用的函数,功能是从样本中随机的按比例选取训数据
第一个参数:样本特征
第二个参数:样本标签
train_size:训练数据占比,整数的话就是样本数量
'''
from sklearn.cross_validation import train_test_split

#建立训练数据和测试数据
X_train,X_test,Y_train,Y_test=train_test_split(exam_X,exam_Y,train_size=.8)

#输出数据大小
print('原始数据特征:',exam_X.shape,
'训练数据特征:',X_train.shape,
'测试数据特征:',X_test.shape)
print('原始数据标签:',exam_Y.shape,
'训练数据标签:',Y_train.shape,
'测试数据标签:',Y_test.shape)


原始数据特征: (20,) 训练数据特征: (16,) 测试数据特征: (4,)
原始数据标签: (20,) 训练数据标签: (16,) 测试数据标签: (4,)

#绘图
plt.scatter(X_train,Y_train,color='b',label='train data')
plt.scatter(X_test,Y_test,color='r',label='test data')
plt.legend(loc=0)
plt.xlabel('Hours')
plt.ylabel('Score')
plt.show()


![这里写图片描述](https://img-blog.csdn.net/20180403111203333?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva3Q1MTMyMjY3MjQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

#第一步:导入线性回归
from sklearn.linear_model import LinearRegression
#第二步:创建线性回归模型
model=LinearRegression()
'''
这里如果直接model.fit(X_train,Y_train)进行训练会报错
由于sklearn要求输入的特征必须是二维数组类型,所以我们需要将特征增加一个维度
在这里根据报错信息使用X_train[:,np.newaxis]和X_train[:,np.newaxis]增加维度的效果一样
'''
import numpy as np
X_train=X_train[:,np.newaxis]
X_test=X_test[:,np.newaxis]
#第三步:训练模型
model.fit(X_train,Y_train)


LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)

'''
最佳拟合线:z=a+bx
截距intercept:a
回归系数:b
'''
#截距
a=model.intercept_
#回归系数
b=model.coef_
print('最佳拟合线:截距a=',a,' 回归系数b=',b)


最佳拟合线:截距a= 6.598073034376128 回归系数b= [16.69370762]

plt.scatter(X_train,Y_train,color='b',label='train data')

#训练数据预测值
Y_train_pred=model.predict(X_train)
#绘制拟合曲线
plt.plot(X_train,Y_train_pred,color='k',linewidth=3,label='best line')

plt.legend(loc=0)
plt.xlabel('Hours')
plt.ylabel('Score')
plt.show()


![这里写图片描述](https://img-blog.csdn.net/20180403111222998?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva3Q1MTMyMjY3MjQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

#相关系数:corr返回结果是一个数据框,存放的是相关系数矩阵
rDf=examDf.corr()
print('相关系数矩阵:')
rDf


相关系数矩阵:

学习时间分数
学习时间1.0000000.923985
分数0.9239851.000000
#方差可以作为评估模型好坏的标志,越接近1,模型越好
model.score(X_test,Y_test)


0.807690002635284


#训练数据散点图
plt.scatter(X_train, Y_train, color='b', label="train data")

#训练数据的预测值
Y_train_pred = model.predict(X_train)
#绘制最佳拟合线:标签用的是训练数据的预测值y_train_pred
plt.plot(X_train, Y_train_pred, color='k', linewidth=3, label="best line")

#测试数据散点图
plt.scatter(X_test, Y_test, color='r', label="test data")

#添加图标标签
plt.legend(loc=2)
plt.xlabel("Hours")
plt.ylabel("Score")
#显示图像
plt.show()


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息