机器学习——线性回归(预测)
前言:大多数模型都是直接给出公式,其实自己私下有推导,涉及好多自己不懂的数学知识,会一点点补充的
机器学习专栏:
文章目录
线性回归(预测)
1、单变量线性回归
1.1基本原理
给定数据集,其中表示第个样本点(表示只有一个属性值),线性回归试图学的预测模型如下:
其中:表示预测值,表示模型参数
1.2最小二乘法
如何确定的值呢?——最小二乘法,这是其实一个凸优化问题
均方误差(MSE):
我们通过最小化MSE确定的值,最小化所有样本到直线上的欧式距离最小,即:
最小二乘法步骤:
1、将对求导得:
2、令上式为0,可以得和的闭式解:
1.3sklearn实现单变量线性回归
这里我使用datasets,熟悉一下,后面将通过pandas加载数据集,更符号实际应用情况
# -*- coding: utf-8 -*-
"""
Created on Sat Nov 9 22:43:52 2019
@author: 1
"""
import matplotlib.pyplot as plt
import numpy as np
from sklearn import datasets, linear_model
from sklearn.metrics import mean_squared_error, r2_score
#导入波士顿房价数据集load_diabetes()
diabetes = datasets.load_diabetes()
# Use only one feature
#np.newaxis的作用就是在这一位置增加一个一维
diabetes_X = diabetes.data[:, np.newaxis, 2]
#diabetes_X.shape=(422x1)
#划分训练集和测试集
diabetes_X_train = diabetes_X[:-20]
diabetes_X_test = diabetes_X[-20:]
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test = diabetes.target[-20:]
#构造线性回归模型
regr = linear_model.LinearRegression()
#拟合训练集
regr.fit(diabetes_X_train, diabetes_y_train)
#测试集的预测值
diabetes_y_pred = regr.predict(diabetes_X_test)
#线性模型的系数
print('Coefficients: \n', regr.coef_)
#均方差
print("Mean squared error: %.2f"
% mean_squared_error(diabetes_y_test, diabetes_y_pred))
#R2决定系数(拟合优度)
print('Variance score: %.2f' % r2_score(diabetes_y_test, diabetes_y_pred))
#真实值
plt.scatter(diabetes_X_test, diabetes_y_test, color='black')
#预测值
plt.plot(diabetes_X_test, diabetes_y_pred, color='blue', linewidth=3)
#指定坐标轴刻度为无刻度
plt.xticks(())
plt.yticks(())
plt.show()
2、多元线性回归
2.1基本原理
上面介绍的单变量线性回归是比较特殊的情况,通常我们获得的数据是,其中表示第个样本点(表示有n个属性值),多元线性回归试图学的预测模型如下:
其中:表示预测值,表示模型参数,亦称为模型偏置(bias)
预测模型可写成向量表达式:
向量表达式参数简单介绍:
,,其中值为1
【注意】多元线性回归与多重线性回归的区别,多重回归是“multiple regerssion”,而多元回归是“multivariate regression”,两者为不同概念,适用的条件不一样,我也不是统计学出身,了解不多,欢迎大家评论区讨论!
多元线性回归的代价函数为:
矩阵形式为:
其中:
表示训练集,由所有训练样本输出构成的向量,
2.2正规方程法
同样对于多元线性回归,最小化均方误差(同样这也是一个凸优化问题):
对求导得(涉及矩阵的求导运算):
令上式为0,可得到最优解的闭式解(涉及矩阵的逆运算):
2.3梯度下降法
要理解梯度下降法首先要知道梯度的概念:梯度的本意是一个向量,表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模),其实这里面的数学知识还是有点复杂的
梯度下降法就是不断找函数下降最快的方向,以找到最优解(线性回归找到的肯定是最优解)
梯度下降公式:
这里的相当于步长,是下降的速率(含方向)
【多元线性回归梯度下降公式的简单推导】
2.4sklearn实现多元线性回归
# -*- coding: utf-8 -*-
"""
Created on Sat Nov 10 22:43:52 2019
@author: 1
"""
import matplotlib.pyplot as plt
from sklearn import linear_model
from sklearn.metrics import mean_squared_error, r2_score
import pandas as pd
from sklearn.model_selection import train_test_split
#导入波士顿房价数据集load_diabetes()
diabetes_X=pd.read_csv('D:\workspace\python\machine learning\data\diabetes_data.csv\X.csv',sep=' ',header=None)
diabetes_Y=pd.read_csv('D:\workspace\python\machine learning\data\diabetes_target.csv\y.csv',sep=' ',header=None)
#利用sklearn里面的包来对数据集进行划分,以此来创建训练集和测试集
#train_size表示训练集所占总数据集的比例
diabetes_X_train,diabetes_X_test,diabetes_y_train,diabetes_y_test = train_test_split(diabetes_X.iloc[:,:4],diabetes_Y,train_size=.80)
#构造线性回归模型
regr = linear_model.LinearRegression()
#拟合训练集
regr.fit(diabetes_X_train, diabetes_y_train)
#测试集的预测值
diabetes_y_pred = regr.predict(diabetes_X_test)
#线性模型的系数
print('Coefficients: \n', regr.coef_)
print('intercept: \n',regr.intercept_)
#均方差
print("Mean squared error: %.2f"
% mean_squared_error(diabetes_y_test, diabetes_y_pred))
#R2决定系数(拟合优度)
print('Variance score: %.2f' % r2_score(diabetes_y_test, diabetes_y_pred))
#预测值和真实值对比图
plt.plot(range(len(diabetes_y_pred)), diabetes_y_pred, 'b', label="predict")
plt.plot(range(len(diabetes_y_test)), diabetes_y_test, 'r', label="test")
plt.xticks(())
plt.yticks(())
plt.show()
2.5模型优化
2.5.1多项式回归
当线性模型太简单导致欠拟合的时候,可以通过增加多项式特征来让模型更好的适应我们的数据,比如房价和房子的长以及宽之间的关系等。而且通过观察数据,分析数据的特征,我们可以令将模型转化为线性模型。
2.5.2sklearn实现多项式回归
# -*- coding: utf-8 -*-
"""
Created on Sun Nov 10 19:55:39 2019
@author: 1
"""
#导入多项式模块
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
#管道模型,将线性回归和多项式串起来
from sklearn.pipeline import Pipeline
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
#导入波士顿房价数据集load_diabetes()
diabetes_X=pd.read_csv('D:\workspace\python\machine learning\data\diabetes_data.csv\X.csv',sep=' ',header=None)
diabetes_Y=pd.read_csv('D:\workspace\python\machine learning\data\diabetes_target.csv\y.csv',sep=' ',header=None)
#数据集的划分
diabetes_X_train,diabetes_X_test,diabetes_y_train,diabetes_y_test = train_test_split(diabetes_X,diabetes_Y,train_size=.80)
#线性模型
regr=LinearRegression(normalize=True)#normalize=True表示标准化
pf=PolynomialFeatures(degree=2,interaction_only=True)#interaction_only=True去除高次幂特征
#管道机制实现了对全部步骤的流式化封装和管理
pf_regr=Pipeline([('pf',pf),('regr',regr)])
pf_regr.fit(diabetes_X_train,diabetes_y_train)
diabetes_y_pred = pf_regr.predict(diabetes_X_test)
print('Coefficients: \n',regr.coef_)
print('intercept: \n',regr.intercept_)
#均方差
print("Mean squared error: %.2f" % mean_squared_error(diabetes_y_test, diabetes_y_pred))
#R2决定系数(拟合优度)
print('Variance score: %.2f' % r2_score(diabetes_y_test, diabetes_y_pred))
#预测值和真实值对比图
plt.plot(range(len(diabetes_y_pred)), diabetes_y_pred, 'b', label="predict")
plt.plot(range(len(diabetes_y_test)), diabetes_y_test, 'r', label="test")
plt.xticks(())
plt.yticks(())
plt.show()

浙公网安备 33010602011771号