赞
踩
线性回归的定义是:目标值预期是输入变量的线性组合。线性模型形式简单、易于建模,但却蕴含着机器学习中一些重要的基本思想。线性回归,是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。
优点:结果易于理解,计算不复杂
缺点:对非线性的数据拟合不好
适用数据类型:数值型和标称型
f(x) = w1*x+w0
,这样通过主要参数w1
就可以得出预测的值。通用公式为:
f(x) = w0+0.2色泽+0.5根蒂+0.3*敲声
,得出的值来判断一个瓜的好与不好的程度。通用公式为:
线性模型中的向量W值,客观的表达了各属性在预测中的重要性,因此线性模型有很好的解释性。对于这种“多特征预测”也就是(多元线性回归),那么线性回归就是在这个基础上得到这些W的值,然后以这些值来建立模型,预测测试数据。简单的来说就是学得一个线性模型以尽可能准确的预测实值输出标记。
那么如果对于多变量线性回归来说我们可以通过向量的方式来表示W值与特征X值之间的关系:
两向量相乘,结果为一个整数是估计值,其中所有特征集合的第一个特征值x0=1,那么我们可以通过通用的向量公式来表示线性模型:
一个列向量的转置与特征的乘积,得出我们预测的结果,但是显然我们这个模型得到的结果可定会有误差,如下图所示:
试图学得一个通过属性的线性组合来进行预测的函数:
损失函数是一个贯穿整个机器学习重要的一个概念,大部分机器学习算法都会有误差,我们得通过显性的公式来描述这个误差,并且将这个误差优化到最小值。
对于线性回归模型,将模型与数据点之间的距离差之和做为衡量匹配好坏的标准,误差越小,匹配程度越大。我们要找的模型就是需要将f(x)和我们的真实值之间最相似的状态。于是我们就有了误差公式,模型与数据差的平方和最小:
- 上面公式定义了所有的误差和,那么现在需要使这个值最小?那么有两种方法,一种使用梯度下降算法
,另一种使正规方程解法
(只适用于简单的线性回归)。
什么是梯度下降算法?
上面误差公式是一个通式,我们取两个单个变量来求最小值,误差和可以表示为
可以通过调整不同的w1 和w0的值,就能使误差不断变化,而当你找到这个公式的最小值时,你就能得到最好的w1,w0而这对(w1,w0)就是能最好描述你数据关系的模型参数。
怎么找cost(w0+w1x1)的最小值? cost(w0+w1w1)的图像其实像一个山谷一样,有一个最低点。找这个最低点的办法就是,先随便找一个点, 然后 沿着这个碗下降的方向找,最后就能找到山谷的最低点。
sklearn.linear_model.LinearRegression
from sklearn.linear_model import LinearRegression
reg = LinearRegression() #实例化一个对象
方法:
fit(X,y,sample_weight = None)
使用X作为训练数据拟合模型,y作为X的类别值。X,y为数组或者矩阵
reg.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
predict(X)
预测提供的数据对应的结果reg.predict([[3,3]])
array([ 3.])
属性:
coef_
表示回归系数w=(w1,w2…)
reg.coef_
array([ 0.5, 0.5])
mean_squared_error(y_true, y_pred)
from sklearn.metrics import mean_squared_error
mean_squared_error()
案例:
from sklearn.datasets import load_boston from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge, LogisticRegression from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.metrics import mean_squared_error, classification_report import joblib import pandas as pd import numpy as np def mylinear(): """ 线性回归直接预测房子价格 :return: None """ # 获取数据 lb = load_boston() # 分割数据集到训练集和测试集 x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size=0.25) print(y_train, y_test) # 进行标准化处理(?) 目标值处理? # 特征值和目标值是都必须进行标准化处理, 实例化两个标准化API std_x = StandardScaler() x_train = std_x.fit_transform(x_train) x_test = std_x.transform(x_test) # 目标值 std_y = StandardScaler() # 这里必须是一个二维的数据,把一维的数据传入用.reshape(-1,1) y_train = std_y.fit_transform(y_train.reshape(-1, 1)) y_test = std_y.transform(y_test.reshape(-1, 1)) # 预测房价结果 # model = joblib.load("./tmp/test.pkl") # # y_predict = std_y.inverse_transform(model.predict(x_test)) # # print("保存的模型预测的结果:", y_predict) # estimator预测 # 正规方程求解方式预测结果 lr = LinearRegression() # 建立这个对象 lr.fit(x_train, y_train) # 用正规方程训练 print(lr.coef_) # 打印出W的值(权重) # 保存训练好的模型 # joblib.dump(lr, "./tmp/test.pkl") # 预测测试集的房子价格 y_lr_predict = std_y.inverse_transform(lr.predict(x_test)) # 预测值并且将标准化的格式转换回来 print("正规方程测试集里面每个房子的预测价格:", y_lr_predict) print("正规方程的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict)) # 评估正规方程的好坏程度 # 梯度下降去进行房价预测 sgd = SGDRegressor() # 建立梯度下降模型 sgd.fit(x_train, y_train) #利用梯度下降进行训练 print(sgd.coef_) # 打印W(权重值) # 预测测试集的房子价格 y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test)) # 预测值并且将标准化的格式转换回来 print("梯度下降测试集里面每个房子的预测价格:", y_sgd_predict) print("梯度下降的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict)) # 岭回归去进行房价预测 rd = Ridge(alpha=1.0) # 建立岭回归模型 这个有个超参数,正则化 rd.fit(x_train, y_train) # 训练岭回归模型 print(rd.coef_) #打印W(权重值) # 预测测试集的房子价格 y_rd_predict = std_y.inverse_transform(rd.predict(x_test)) # 预测值并且将标准化的格式转换回来 print("岭回归测试集里面每个房子的预测价格:", y_rd_predict) print("岭回归的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_rd_predict)) return None if __name__ == "__main__": mylinear()
求解:w=(X^TX)^−1X^Ty
,X为特征值矩阵,y为目标值矩阵
缺点:当特征过于复杂,求解速度太慢对于复杂的算法,不能使用正规方程求解(逻辑回归等)
sklearn.linear_model.LinearRegression
正规方程
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
案例看上面的梯度下降
特点:线性回归器是最为简单、易用的回归模型。从某种程度上限制了使用,尽管如此,在不知道特征之间关系的前提下,我们仍然使用线性回归器作为大多数系统的首要选择。
过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在训练数据外的数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)
欠拟合:一个假设在训练数据上不能获得更好的拟合, 但是在训练数据外的数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)
sklearn.linear_model.Ridge(alpha=1.0)
alpha
:正则化力度
coef_
:回归系数
from sklearn.linear_model import Ridge
rd = Ridge(alpha=1.0) # 建立岭回归模型 这个有个超参数,正则化
rd.fit(x_train, y_train) # 训练岭回归模型
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。