线性回归通过一个或者多个自变量与因变量之间之间进行建模的回归分析。其中特点为一个或多个称为回归系数的模型参数的线性组合。
一元线性回归:涉及到的变量只有一个。
多元线性回归:涉及到的变量两个或两个以上。
图例
最小二乘法
线性回归中的最小二乘法是用来求线性回归中的损失函数(误差大小),我们通常通过减少这个损失来提高回归模型的可靠性。
回归性能评估
过拟合和欠拟合
L2正则化(解决过拟合问题)
线性回归案例(美国King County房价预测训练赛)
import pandas as pd
from sklearn.linear_model import LinearRegression,Ridge,SGDRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler
import numpy as np
def predict_house_price():
df = pd.read_csv('kc_train.csv',
names=['销售日期','销售价格','卧室数','浴室数','房屋面积','停车面积','楼层数'
,'房屋评分','建筑面积','地下室面积','建筑年份','修复年份','纬度','经度'])
# 提取特征值和目标值
# 将日期转换成具体的月份并删除原销售如期
df['销售日期'] = pd.to_datetime(df['销售日期'])
date = pd.DatetimeIndex(df['销售日期'])
df['销售月份'] = date.month
df = df.drop(['销售日期'],axis=1)
df.drop(['修复年份','建筑年份','纬度','经度'],axis=1,inplace=True)
# 划分特征值和目标值数据
x = df.iloc[:,1:]
y = df.iloc[:,0]
# 分割数据为训练集和测试集
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25)
# 对数据进行特征预处理(这里选择标准化)
# 这里需要我们实例两个标准化API分别对训练值和测试值进行标准化
x_std = StandardScaler()
x_train = x_std.fit_transform(x_train)
x_test = x_std.transform(x_test)
y_std = StandardScaler()
# 因为新版本的标准化 传入的数据需要是一个二维数组
# 因此需要对目标值数据进行转换 先将数据转换成ndarray类型再使用reshape方法修改函数形状
y_train = y_std.fit_transform(np.array(y_train).reshape(-1,1))
y_test = y_std.transform(np.array(y_test).reshape(-1,1))
# 以下分别采用正规方程、梯度下降和岭回归分别对数据进行训练和预测看看哪个算法效果更好
# 通过比较均方误差来进行比较
# 正规方程
lr = LinearRegression()
lr.fit(x_train,y_train)
# 这里为了让数据更加直观,我们需要将标准化后的预测值再次转换正非标准化数据
y_lr_predict = y_std.inverse_transform(lr.predict(x_test))
# 查看回归系数即w值
# 由于数据过长我们只取出前十个进行比较
print('正规方程预测每个房子的价格为:',y_lr_predict[:10])
# 计算出正规方程的均方误差
print('正规方程的均方误差为:',mean_squared_error(y_std.inverse_transform(y_test),y_lr_predict))
# 梯度下降 步骤与正规方程一样 一下不多做注释
sgd = SGDRegressor()
sgd.fit(x_train,y_train)
y_sgd_predict = y_std.inverse_transform(sgd.predict(x_test))
# print('梯度下降的回归系数为:',sgd.coef_)
print('梯度下降预测每个房子的价格为:',y_sgd_predict[:10])
print('梯度下降的均方误差为:',mean_squared_error(y_std.inverse_transform(y_test),y_sgd_predict))
# 岭回归
rg = Ridge(alpha=1.0)
rg.fit(x_train,y_train)
y_rg_predict = y_std.inverse_transform(rg.predict(x_test))
# print('岭回归的回归系数为:', rg.coef_)
print('岭回归预测每个房子的价格为:', y_rg_predict[:10])
print('岭回归的均方误差为:', mean_squared_error(y_std.inverse_transform(y_test), y_rg_predict))
print('真实房屋价格为:',y_std.inverse_transform(y_test[:10]))
if __name__ == '__main__':
predict_house_price()
以上是博主在学习Python-机器学习线性回归中的总结
需要数据集的下方评论