# -*- coding: utf-8 -*-
"""
Created on Fri Mar 8 14:07:53 2019
---------------------
作者:EircWonh
来源:CSDN
原文:https://blog.csdn.net/weixin_40014576/article/details/79918819
版权声明:本文为博主原创文章,转载请附上博文链接!
"""
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pandas import DataFrame,Series
from sklearn.cross_validation import train_test_split
from sklearn.linear_model import LinearRegression
#创建数据集
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]}
# 将?替换为标准缺失值表示。
examDict = examDict.replace(to_replace='?', value=np.nan)
# 丢弃带有缺失值的数据(只要有一个维度有缺失)。
examDict = examDict.dropna(how='any')
# 输出data的数据量和维度。
print("data shape:",examDict.shape)
#转换为DataFrame的数据格式
examDf = DataFrame(examDict)
#绘制散点图
plt.scatter(examDf.分数,examDf.学习时间,color = 'b',label = "Exam Data")
#添加图的标签(x轴,y轴)
plt.xlabel("Hours")
plt.ylabel("Score")
#显示图像
plt.show()
"""
从上图可以看到对于分数和时间来说存在相应的线性关系,且俩数据间相关性较强。
在此可以通过相关性来衡量两个变量因素的相关密切程度。
相关系数是用以反映变量之间相关关系密切程度的统计指标。
r(相关系数) = x和y的协方差/(x的标准差*y的标准差) == cov(x,y)/σx*σy(即person系数)
对于相关性强度来说的化有以下的关系:
0~0.3 弱相关
0.3~0.6 中等程度相关
0.6~1 强相关
"""
rDf = examDf.corr()
print(rDf)
#处理样本数据
exam_X=examDf[[0]]
exam_Y=examDf[[1]]
#将原数据集拆分训练集和测试集
X_train,X_test,Y_train,Y_test = train_test_split(exam_X,exam_Y,train_size=0.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)
#训练数据散点图
plt.scatter(X_train, Y_train, color="blue", label="train data")
#测试数据散点图
plt.scatter(X_test, Y_test, color="red", label="test data")
#添加图标标签
plt.legend(loc=2)
plt.xlabel("Hours")
plt.ylabel("Pass")
#显示图像
plt.savefig("tests.jpg")
#plt.show()
#------------------------------------------------------------------------------
model = LinearRegression()
#对于模型错误我们需要把我们的训练集进行reshape操作来达到函数所需要的要求
# model.fit(X_train,Y_train)
#reshape如果行数=-1的话可以使我们的数组所改的列数自动按照数组的大小形成新的数组
#因为model需要二维的数组来进行拟合但是这里只有一个特征所以需要reshape来转换为二维数组
X_train = X_train.values.reshape(-1,1)
X_test = X_test.values.reshape(-1,1)
print("x_train:",X_train)
print("y_train:",Y_train)
model.fit(X_train,Y_train)
#得到方程式
a = model.intercept_#截距
b = model.coef_#回归系数
print("最佳拟合线:截距",a,",回归系数:",b)
print("方程式:y=",a[0],"+x*",b[0][0])
#验证方程式
#训练数据的预测值
y_train_pred = model.predict(X_train)
#绘制最佳拟合线:标签用的是训练数据的预测值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.legend(loc=2)
plt.xlabel("Hours")
plt.ylabel("Score")
#显示图像
plt.savefig("lines.jpg")
plt.show()
score = model.score(X_test,Y_test)
print(score)