Python 线性回归处理糖尿病数据 计算MSE等

实验内容:
糖尿病数据预测根据美国疾病控制预防中心的数据,现在美国1/7的成年人患有糖尿病。但是到2050年,这个比例将会快速增长至高达1/3。在UCL机器学习数据库里一个糖尿病数据集,通过这一数据集,学习如何利用线性回归分析来预测糖尿病:
数据地址:https://github.com/susanli2016/Machine-Learning-with-Python/blob/master/diabetes.csv
数据特征属性:index([‘Pregnancies’, ‘Glucose’, ‘BloodPressure’, ‘SkinThickness’, ‘Insulin’,‘BMI’, ‘DiabetesPedigreeFunction’, ‘Age’, ‘Outcome’], dtype=‘object’)
特征(怀孕次数,血糖,血压,皮脂厚度,胰岛素,BMI身体质量指数,糖尿病遗传函数,年龄,结果)“结果”是要预测的特征,0意味着未患糖尿病,1意味着患有糖尿病。在768个数据点中,500个被标记为0,268个标记为1。

实验模型介绍:
线性回归(Linear regression)是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析 Y=a1x1+a2x2+a3x3+…+a8x8+b根据实验数据,求出A和B (b为偏置项)要求MSE

代码如下:

import pandas as pd
import seaborn as sns
from math import sqrt
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
# 通过read_csv来读取我们的目的数据集
adv_data = pd.read_csv('C:/Users/24224/Documents/课程内容集合/srf/diabetes.csv',engine='python')
# 得到我们所需要的数据集且查看其前几列以及数据形状
print('head:', adv_data.head(), '\nShape:', adv_data.shape)
print("1CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC")
'''
# 数据描述
print(adv_data.describe())
print("2CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC")
# 缺失值检验
print(adv_data[adv_data.isnull() == True].count())
print("3CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC")
adv_data.boxplot()
plt.savefig("boxplot.jpg")
plt.show()
'''
##相关系数矩阵 r(相关系数) = x和y的协方差/(x的标准差*y的标准差) == cov(x,y)/σx*σy
# 相关系数0~0.3弱相关0.3~0.6中等程度相关0.6~1强相关
print(adv_data.corr())
print("4CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC")
'''
# 建立散点图来查看数据集里的数据分布
# seaborn的pairplot函数绘制X的每一维度和对应Y的散点图。通过设置size和aspect参数来调节显示的大小和比例。
sns.pairplot(adv_data, x_vars=['Pregnancies', 'Glucose', 'BloodPressure','SkinThickness','Insulin','BMI','DiabetesPedigreeFunction','Age'], y_vars='Outcome', height=7, aspect=0.8, kind='reg')
plt.savefig("pairplot.jpg")
plt.show()
'''
# 利用sklearn里面的包来对数据集进行划分,以此来创建训练集和测试集
# train_size表示训练集所占总数据集的比例
X_train, X_test, Y_train, Y_test = train_test_split(adv_data.loc[:, 'Pregnancies':'Age'], adv_data.Outcome, test_size=.20,train_size=.80)
print("原始数据特征:", adv_data.loc[:, 'Pregnancies':'Age'].shape,
      ",训练数据特征:", X_train.shape,
      ",测试数据特征:", X_test.shape)
print("5CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC")
'''
print("原始数据标签:", adv_data.Outcome.shape,
      ",训练数据标签:", Y_train.shape,
      ",测试数据标签:", Y_test.shape)
print("6CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC")
'''
model = LinearRegression()
model.fit(X_train, Y_train)
a = model.intercept_  # 截距
b = model.coef_  # 回归系数
print("最佳拟合线:截距", a, ",回归系数:", b)
print("7CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC")
'''
score = model.score(X_test, Y_test)
print(score)
print("8CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC")
'''
target = a+b[0]*adv_data.iloc[:, 0]+b[1]*adv_data.iloc[:, 1]+b[2]*adv_data.iloc[:, 2]+b[3]*adv_data.iloc[:, 3]+b[4]*adv_data.iloc[:, 4]\
         +b[5]*adv_data.iloc[:, 5]+b[6]*adv_data.iloc[:, 6]+b[7]*adv_data.iloc[:, 7]
prediction = adv_data.iloc[:, -1]
error = []
for i in range(len(target)):
    error.append(target[i] - prediction[i])
print("Errors: ", error)
squaredError = []
absError = []
for val in error:
    squaredError.append(val * val)  #target-prediction之差平方 
    absError.append(abs(val))#误差绝对值
print("Square Error: ", squaredError)
print("Absolute Value of Error: ", absError)
print("MSE = ", sum(squaredError) / len(squaredError)) #均方误差MSE
print("RMSE = ", sqrt(sum(squaredError) / len(squaredError))) #均方根误差RMSE
print("MAE = ", sum(absError) / len(absError))#平均绝对误差MAE

MSE = 0.15903368204033314 #均方误差MSE
RMSE = 0.39879027325191013 #均方根误差RMSE
MAE = 0.33745787766094454 #平均绝对误差MAE

你可能感兴趣的:(Python 线性回归处理糖尿病数据 计算MSE等)