通过数据之间的关系建立一种近似的函数关系
《遗传的身高向平均数方向的回归》
Regression
不仅是数据拟合手段,更是预测,不断向平均值回归
用两个变量建立线性回归方程,来拟合与预测两变量关系的算法
常规求解:
最小二乘法(实际值与预测值之间偏差的平方和最小来拟合曲线)
回归的评价方法:
R方、均方误差(MSE)、均方根误差(RMSE)等
单变量线性回归分析:
在回归分析中,只包含一个自变量与一个因变量,且因变量自变量之间关系为线性关系。
多变量线性回归分析:
回归分析种包含两个或两个以上的自变量,且因变量和自变量之间的关系为线性关系。
基本模型:
hθ(x)=θ0+θ1x
注:
常规方法:
成本/代价/损失函数:
m | 训练集中训练样本的个数 |
---|---|
(x(i),y(i)) | 第i个训练样本,上标i是索引,表示第i个训练样本 |
陈本函数最小问题的常规解法:
回归算法中,主要的评价方法:
除了对自身数据进行拟合与评价外,当模型训练完毕后,我们需要使用一个与训练数据集独立的新的数据集去对训练模型进行验证。
获取新的数据集:
采用Scikit-learn的内置数据集波士顿房屋价格
采用单变量线性回归算法对数据进行拟合预测
特征变量 | 目标变量 |
---|---|
房屋价格(MEDV) | 每个房屋的房间数量(RM) |
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
# 导入数据
boston = load_boston()
print(boston.keys())
print(boston.feature_names)
bos = pd.DataFrame(boston.data)
print(bos[5].head())
bos_target = pd.DataFrame(boston.target)
print(bos_target.head())
# 绘制散点图
x = bos.iloc[:,5:6]
y = bos_target
plt.scatter(x,y)
plt.show()
在有监督的机器学习中,数据集被划分为:
训练集(课本) | 用于训练的数据集,从而得到模型的未知参数 |
---|---|
验证集(作业) | 评估训练集的效果,调整参数,最好性能 |
测试集(考试) | 测试训练后模型的子集,用来评价模型泛化能力 |
划分数据集:
# 导入数据
boston = load_boston()
bos = pd.DataFrame(boston.data)
bos_target = pd.DataFrame(boston.target)
# 数据转化
X = bos.iloc[:,5:6]
y = bos_target
X = np.array(X.values)
y = np.array(y.values)
# 数据划分
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.25)
print(X_train.shape,X_test.shape,y_train.shape,y_test.shape)
采用Scikit-learn库中的LinearRegression实现对线性回归的求解和预测
lr = LinearRegression()
# 求解参数
lr.fit(X_train,y_train)
print('a=',lr.coef_)
print('b=',lr.intercept_)
# 测试集进行预测
y_hat = lr.predict(X_test)
print(y_hat)
plt.figure(figsize=(10,6))
t = np.arange(len(X_test))
plt.plot(t,y_test,'r',linewidth = 2,label = 'y_test')
plt.plot(t,y_hat,'g',linewidth = 2,label = 'y_hat')
plt.legend()
plt.show()
r2_1 = lr.score(X_test,y_test)
r2_2 = r2_score(y_test,y_hat)
MAE = metrics.mean_absolute_error(y_test,y_hat)
MSE = metrics.mean_squared_error(y_test,y_hat)
RMSE = np.sqrt(metrics.mean_squared_error(y_test,y_hat))
print("r2={}\nr2={}\nMAE={}\nMSE={}\nRMSE={}\n".format(r2_1,r2_2,MAE,MSE,RMSE))
r2=0.516602648405293
r2=0.516602648405293
MAE=3.8799660045066524
MSE=38.24985587763383
RMSE=6.184646786812795
# 最小二乘法
def linefit(x,y):
N = len(x)
sx,sy,sxx,syy,sxy = 0,0,0,0,0
for i in range(0,N):
sx += x[i]
sy += y[i]
sxx += x[i] * x[i]
syy += y[i] * y[i]
sxy += x[i] * y[i]
a = (sy * sx / N - sxy)/(sx * sx / N - sxx)
b = (sy - a * sx)/N
return a,b
a,b = linefit(X_train,y_train)
y_hat1 = a * X_test + b
MAE = metrics.mean_absolute_error(y_test,y_hat1)
MSE = metrics.mean_squared_error(y_test,y_hat1)
RMSE = np.sqrt(metrics.mean_squared_error(y_test,y_hat1))
print("MAE={}\nMSE={}\nRMSE={}\n".format(MAE,MSE,RMSE))
MAE=5.104824579532293
MSE=51.6002718147744
RMSE=7.183332918275082