一、线性回归
定义:线性回归通过一个或者多个自变量与因变量之间之间进行建模的回归分析。其中特点为一个或多个称为回归系数的模型参数的线性组合
一元线性回归:涉及到的变量只有一个
多元线性回归:涉及到的变量两个或两个以上
损失函数(误差大小)
y_i为第i个训练样本的真实值
ℎ_w(x_i)为第i个训练样本特征值组合预测函数
如何去求模型当中的W,使得损失最小?
(目的是找到最小损失对应的W值)
最小二乘法之正规方程(不做要求):
二、最小二乘法之梯度下降(理解过程)
我们以单变量中的w0,w1为例子:
案例分析
# coding=utf-8
import pandas as pd
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.tree import DecisionTreeClassifier,export_graphviz
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression,SGDRegressor
from sklearn.preprocessing import StandardScaler
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()
y_train = std_y.fit_transform(y_train.reshape(-1,1))
y_test = std_y.transform(y_test.reshape(-1,1))
#estimator 预测
#正规方程求解方式预测结果
lr = LinearRegression()
lr.fit(x_train,y_train)
print(lr.coef_)
#预测测试集的房子价格
y_predict = std_y.inverse_transform(lr.predict(x_test))
print("测试集的每个房子的预测价格",y_predict)
if __name__ == "__main__":
mylinear()
# coding=utf-8
import pandas as pd
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.tree import DecisionTreeClassifier,export_graphviz
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression,SGDRegressor
from sklearn.preprocessing import StandardScaler
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()
y_train = std_y.fit_transform(y_train.reshape(-1,1))
y_test = std_y.transform(y_test.reshape(-1,1))
#estimator 预测
#正规方程求解方式预测结果
lr = LinearRegression()
lr.fit(x_train,y_train)
print(lr.coef_)
#预测测试集的房子价格
y_lr_predict = std_y.inverse_transform(lr.predict(x_test))
print("正规测试集的每个房子的预测价格",y_lr_predict)
#梯度下降进行房价预测
sgd = SGDRegressor()
sgd.fit(x_train, y_train)
print(sgd.coef_)
# 预测测试集的房子价格
y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test).reshape(-1,1))
print("梯度测试集的每个房子的预测价格", y_sgd_predict)
return None
if __name__ == "__main__":
mylinear()
三、回归性能评估
# coding=utf-8
import pandas as pd
from sklearn.feature_extraction import DictVectorizer
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.tree import DecisionTreeClassifier,export_graphviz
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_boston
from sklearn.linear_model import LinearRegression,SGDRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error
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()
y_train = std_y.fit_transform(y_train.reshape(-1,1))
y_test = std_y.transform(y_test.reshape(-1,1))
#estimator 预测
#正规方程求解方式预测结果
lr = LinearRegression()
lr.fit(x_train,y_train)
print(lr.coef_)
#预测测试集的房子价格
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_)
# 预测测试集的房子价格
y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test).reshape(-1,1))
print("梯度下降测试集的每个房子的预测价格", y_sgd_predict)
print("梯度下降的均方误差:", mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))
return None
if __name__ == "__main__":
mylinear()
四、过拟合和欠拟合
过拟合:一个假设在训练数据上能够获得比其他假设更好的拟合, 但是在训练数据外的数据集上却不能很好地拟合数据,此时认为这个假设出现了过拟合的现象。(模型过于复杂)
原因:
原始特征过多,存在一些嘈杂特征,
模型过于复杂是因为模型尝试去兼顾
各个测试数据点
解决办法:
进行特征选择,消除关联性大的特征(很难做)
交叉验证(让所有数据都有过训练)
正则化(了解)
欠拟合:一个假设在训练数据上不能获得更好的拟合, 但是在训练数据外的数据集上也不能很好地拟合数据,此时认为这个假设出现了欠拟合的现象。(模型过于简单)
原因:
学习到数据的特征过少
解决办法:
增加数据的特征数量
总结
1、LinearRegression与SGDRegressor评估
2、特点:线性回归器是最为简单、易用的回归模型。
从某种程度上限制了使用,尽管如此,在不知道特征之
间关系的前提下,我们仍然使用线性回归器作为大多数
系统的首要选择。
小规模数据:LinearRegression(不能解决拟合问题)以及其它
大规模数据:SGDRegressor