一、 问题描述
在Capital Bikeshare(美国Washington, D.C.的一个共享单车公司)提供的自行车数据集Bike-Sharing-Dataset.csv上进行回归分析(分别使用线性回归、岭回归和Lasso回归)。给出模型参数并对比几种模型的性能。
二、 算法描述
1.线性回归
线性回归是一种用于建立自变量和因变量之间线性关系的模型。在线性回归中,我们假设自变量和因变量之间存在一个线性关系,并使用最小二乘法来估计模型参数。最小二乘法的目标是最小化残差平方和(RSS),即预测值与实际值之间的差异。
2.岭回归
岭回归是一种用于解决多重共线性问题的线性回归方法。在多重共线性问题中,自变量之间存在高度相关性,使得模型参数的估计不稳定。岭回归通过对模型参数施加L2正则化,使得模型参数的估计更加稳定。
3.Lasso回归
Lasso回归是一种用于解决多重共线性问题的线性回归方法。与岭回归不同的是,Lasso回归通过对模型参数施加L1正则化,使得一些自变量的系数变成0,从而实现特征选择的效果。
三、 数据集描述
Bike-Sharing-Dataset.csv数据集是一个关于共享单车骑行量的数据集,包含以下特征:
-
instant:记录索引
-
dteday:日期
-
season:季节(1:春季、2:夏季、3:秋季、4:冬季)
-
yr:年份(0:2011年,1:2012年)
-
mnth:月份(1~12)
-
hr:小时(0~23)
-
holiday:是否为假期(0:否,1:是)
-
weekday:星期几(0~6)
-
workingday:是否为工作日(0:否,1:是)
-
weathersit:天气状况(1:晴朗、2:多云、3:小雨/小雪、4:大雨/大雪)
-
temp:摄氏温度
-
atemp:体感温度
-
hum:湿度
-
windspeed:风速
-
casual:非注册用户骑行量
-
registered:注册用户骑行量
-
cnt:总骑行量
数据集共有731条记录
表3-1 数据集前10条数据
instant | dteday | season | yr | mnth | holiday | weekday | workingday | weathersit | temp | atemp | hum | windspeed | casual | registered | cnt |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2011/1/1 | 1 | 1 | 6 | 2 | 0.344167 | 0.363625 | 0.805833 | 0.160446 | 331 | 654 | 985 | |||
2 | 2011/1/2 | 1 | 1 | 2 | 0.363478 | 0.353739 | 0.696087 | 0.248539 | 131 | 670 | 801 | ||||
3 | 2011/1/3 | 1 | 1 | 1 | 1 | 1 | 0.196364 | 0.189405 | 0.437273 | 0.248309 | 120 | 1229 | 1349 | ||
4 | 2011/1/4 | 1 | 1 | 2 | 1 | 1 | 0.2 | 0.212122 | 0.590435 | 0.160296 | 108 | 1454 | 1562 | ||
5 | 2011/1/5 | 1 | 1 | 3 | 1 | 1 | 0.226957 | 0.22927 | 0.436957 | 0.1869 | 82 | 1518 | 1600 | ||
6 | 2011/1/6 | 1 | 1 | 4 | 1 | 1 | 0.204348 | 0.233209 | 0.518261 | 0.089565 | 88 | 1518 | 1606 | ||
7 | 2011/1/7 | 1 | 1 | 5 | 1 | 2 | 0.196522 | 0.208839 | 0.498696 | 0.168726 | 148 | 1362 | 1510 | ||
8 | 2011/1/8 | 1 | 1 | 6 | 2 | 0.165 | 0.162254 | 0.535833 | 0.266804 | 68 | 891 | 959 | |||
9 | 2011/1/9 | 1 | 1 | 1 | 0.138333 | 0.116175 | 0.434167 | 0.36195 | 54 | 768 | 822 | ||||
10 | 2011/1/10 | 1 | 1 | 1 | 1 | 1 | 0.150833 | 0.150888 | 0.482917 | 0.223267 | 41 | 1280 | 1321 |
四、 关键代码
1.引入相关的库
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
import os
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import RidgeCV
from sklearn.linear_model import LassoCV
from sklearn.metrics import r2_score*#R square*
from sklearn.metrics import mean_squared_error *#**均方误差*
from sklearn.metrics import mean_absolute_error *#**平方绝对误差*
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt
2.数据预处理
#对类别型特征,进行独热编码
categorical_features = ['season','mnth','weathersit','weekday']
#数据类型变为object,才能被get_dummies处理
for col in categorical_features:
train[col] = train[col].astype('object')
X_train_cat = train[categorical_features]
X_train_cat = pd.get_dummies(X_train_cat)
print(X_train_cat)
#数值型变量预处理,
mn_X = MinMaxScaler()
numerical_features = ['temp','atemp','hum','windspeed']
temp = mn_X.fit_transform(train[numerical_features])
X_train_num = pd.DataFrame(data=temp, columns=numerical_features, index =train.index)
print(X_train_num.head())
# 合并数据
X_train = pd.concat([X_train_cat, X_train_num, train['holiday'], train['workingday']], axis = 1, ignore_index=False)
# 合并数据
FE_train = pd.concat([train['instant'], X_train, train['yr'],train['cnt']], axis = 1)
FE_train.to_csv('./data/FE_Bike-Sharing-Dataset.csv', index=False) #保存数据
print(FE_train.info())
3.模型训练
#分别使用线性回归,岭回归,Lasso回归进行数据预测
lrg=LinearRegression()
ridge=RidgeCV()
lasso=LassoCV()
lrg.fit(X_train,y_train)
ridge.fit(X_train,y_train)
lasso.fit(X_train,y_train)
4.模型参数
# 最小二乘线性回归
plt.barh(range(31),lrg.coef_,align="center",color="#66c2a5",tick_label=x_label,label="系数")
# 设置x,y轴标签
plt.xlabel("系数值")
plt.ylabel("特征")
plt.title('Coefficients in the OLS Model')
plt.legend()
plt.show()
# 岭回归
plt.barh(range(31),ridge.coef_,align="center",color="#66c2a5",tick_label=x_label,label="系数")
# 设置x,y轴标签
plt.xlabel("系数值")
plt.ylabel("特征")
plt.title('Coefficients in the Ridge Model')
plt.legend()
plt.show()
# Lasso
plt.barh(range(31),lasso.coef_,align="center",color="#66c2a5",tick_label=x_label,label="系数")
# 设置x,y轴标签
plt.xlabel("系数值")
plt.ylabel("特征")
plt.title('Coefficients in the Lasso Model')
plt.legend()
plt.show()
5.模型评价
#不同线性回归模型在不同评价指标下的性能
#线性回归
lrg_y_predict=lrg.predict(X_test)
lrg_score = r2_score(y_test, lrg_y_predict)
lrg_mse=mean_squared_error(y_test,lrg_y_predict)
lrg_Rmse=mean_absolute_error(y_test,lrg_y_predict)
#岭回归
ridge_y_predict=ridge.predict(X_test)
ridge_score = r2_score(y_test, ridge_y_predict)
ridge_mse=mean_squared_error(y_test,ridge_y_predict)
ridge_Rmse=mean_absolute_error(y_test,ridge_y_predict)
#Lasso回归
lasso_y_predict=lasso.predict(X_test)
lasso_score = r2_score(y_test, lasso_y_predict)
lasso_mse=mean_squared_error(y_test,lasso_y_predict)
lasso_Rmse=mean_absolute_error(y_test,lasso_y_predict)
r2 = [lrg_score, ridge_score, lasso_score]
mse = [lrg_mse, ridge_mse, lasso_mse]
rmse = [lrg_Rmse, ridge_Rmse, lasso_Rmse]
datasheet = [[0,0,0] for _ in range(3)]
columns = ['R2', 'MSE', 'RMSE']
index = ['最小二乘线性回归', '岭回归', 'Lasso']
for i in range(3):
datasheet[i][0] = r2[i]
datasheet[i][1] = mse[i]
datasheet[i][2] = rmse[i]
df1 = pd.DataFrame(datasheet, columns=columns, index=index)
display(df1)
五、 实验结果
图5-1 最小二乘线性回归的回归参数
图5-2 岭回归的回归参数
图5-3 Lasso的回归参数
六、 实验分析
1.模型评价
表6-1 共享单车骑行量预测数据集上不同线性回归模型在不同评价指标下的性能值
线性回归模型 | R2 | MSE | RMSE |
---|---|---|---|
最小二乘线性回归 | 0.853982 | 621034.047619 | 584.360544 |
岭回归 | 0.854637 | 618250.941409 | 589.294984 |
Lasso | 0.852882 | 625712.850472 | 593.211823 |
2.分析结论
根据以上模型评价参数发现,各回归模型的差异不大,均能达到85%左右的准确率,模型已经可以用于预测。
七、 总结与展望
本实验对共享单车骑行量预测问题进行了探究,并使用回归模型和三种不同的正则化方法进行了模型学习和评价。实验结果表明,在这个问题上,无正则化模型的表现略优于其他两种模型。未来可以进一步探究其他人工智能算法在这个问题上的表现,并尝试使用更多的特征进行预测。