此数据集包含的是从 2011 年 1 月 1 日到 2012 年 12 月 31 日期间每天每小时的骑车人数。骑车用户分成临时用户和注册用户,cnt 列是骑车用户数汇总列。你可以在上方看到前几行数据。
下图展示的是数据集中前 10 天左右的骑车人数(某些天不一定是 24 个条目,所以不是精确的 10 天)。你可以在这里看到每小时租金。这些数据很复杂!周末的骑行人数少些,工作日上下班期间是骑行高峰期。我们还可以从上方的数据中看到温度、湿度和风速信息,所有这些信息都会影响骑行人数。你需要用你的模型展示所有这些数据。
# 数据读取及基本处理
import pandas as pd
import numpy as np
# 读入数据
train = pd.read_csv("day.csv")
print(train.head())
#print("train : " + str(train.shape))
Instant记录号
Dteday:日期
Season:季节(1=春天、2=夏天、3=秋天、4=冬天)
yr:年份,(0: 2011, 1:2012)
mnth:月份( 1 to 12)
hr:小时 (0 to 23) (在hour.csv有)
holiday:是否是节假日
weekday:星期中的哪天,取值为0~6 workingday:
是否工作日 1=工作日 (是否为工作日,1为工作日,0为周末或节假日 weathersit:天气(1:晴天,多云;2:雾天,阴天;3:小雪,小雨;4:大雨,大雪,大雾)
temp:气温摄氏度
atemp:体感温度
hum:湿度
windspeed:
风速
casual:非注册用户个数
registered:注册用户个数
cnt:给定日期(天)时间(每小时)总租车人数,
响应变量y (cnt = casual + registered)
print(train.info())
查看数据各特征的分布,以及特征之间是否存在相关关系等冗余。
在Python中,有很多数据可视化途径。
Matplotlib非常强大,也很复杂,不易于学习。
Seaborn是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,
大多数情况下使用seaborn就能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。
## 各属性的统计特性;
# 观测数据,初步估测个特征分布:
# 1:searn--mean值在25%-59%分位数之间;特征方差均较小;
# 2:casual registered cnt为需要预测的y值(本实例只考虑cnt);
# 3.大部分特征均值在1/4-1/2分位数之间噪声值较少基本不存在;少数在1/2-3/4分位数之间噪声值存在;
data.describe()
def Data_preprocessing():
#对类别型特征,观察其取值范围及直方图
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('独热编码结果')
print(X_train_cat)
from sklearn.preprocessing import MinMaxScaler
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('数据归一化处理结果')
print(X_train_num.head())
# 合并数据
X_train = pd.concat([X_train_cat, X_train_num, train['holiday'], train['workingday']], axis = 1, ignore_index=False)
print('X_train.head(): ')
print(X_train.head())
# 合并数据
FE_train = pd.concat([train['instant'], X_train, train['yr'],train['cnt']], axis = 1)
FE_train.to_csv('FE_day.csv', index=False) #保存数据
print('FE_train.head():')
print(FE_train.head())
print(FE_train.info())
这里的数据预处理包括将特征数据转换为独热编码,数据归一化,合并数据等处理
独热编码的结果如下图:
数据归一化结果 :
数据合并前的数据head:
数据合并后的head:
import pandas as pd
import numpy as np
from bike import Data_preprocessing
from sklearn.model_selection import train_test_split
import os
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import Ridge
from sklearn.linear_model import RidgeCV
from sklearn.linear_model import Lasso
from sklearn.linear_model import ElasticNet
from sklearn.metrics import r2_score#R square
from sklearn.metrics import mean_squared_error #均方误差
from sklearn.metrics import mean_absolute_error #平方绝对误差
import matplotlib.pyplot as plt
def load_data():#导入数据
global x_data,y_data,name_data
if not os.path.isfile("FE_day.csv"):#调用已经做好特征工程的文件,如果文件不存在,就调用函数生成该文件
Data_preprocessing()
data = pd.read_csv("FE_day.csv")
data = data.drop(['instant','hum','windspeed'], axis = 1)#去掉编号、湿度、风速等不相关数据
## print(data)
y_data = data['cnt']
x_data = data.drop('cnt', axis = 1)
y_data=np.array(y_data)
x_data=np.array(x_data)
name_data =list(data.columns)#返回对象列索引
## print(x_data)
## print(y_data)
## print(name_data)
def traintestsplit():#数据分割,一部分用于验证、一部分用于训练
global x_data,y_data,name_data
X_train,X_test,y_train,y_test=train_test_split(x_data,y_data,random_state=0,test_size=0.20)#分割数据,20%用于测试,80%用于训练
return X_train,X_test,y_train,y_test
load_data() #数据导入
X_train,X_test,y_train,y_test=traintestsplit() #数据分割
#使用线性回归模型LinearRegression对数据进行训练及预测
lr=LinearRegression()#最小二乘线性回归模型
#lr=Ridge()#岭回归模型
#lr=RidgeCV()#
lr=Lasso()#Lasso模型
#lr=ElasticNet()
#使用训练数据进行参数估计
lr.fit(X_train,y_train) #训练模型
#R2评价指标
lr_y_predict=lr.predict(X_test)
score = r2_score(y_test, lr_y_predict)
print("R2:{}".format(score))
#MSE评价指标
mse_test=mean_squared_error(y_test,lr_y_predict)
print("MSE:{}".format(mse_test))
#RMSE评价指标
Rmse_test=mean_absolute_error(y_test,lr_y_predict)
print("RMSE:{}".format(Rmse_test))
#分别使用线性回归,岭回归,Lasso回归进行数据预测
lrg=LinearRegression()
ridge=Ridge()
lasso=Lasso()
lrg.fit(X_train,y_train)
ridge.fit(X_train,y_train)
lasso.fit(X_train,y_train)
#数据视图,此处获取各个算法的训练数据的coef_:系数,coef_可以理解为系数
plt.figure(figsize=(12,9))
#线性回归 得到的coef
axes=plt.subplot(221)
axes.plot(lrg.coef_)
axes.set_title('lrg_coef')
#l岭回归 得到的coef
axes=plt.subplot(222)
axes.plot(ridge.coef_)
axes.set_title('ridge_coef')
#lasso回归 得到的coef
axes=plt.subplot(223)
axes.plot(lasso.coef_)
axes.set_title('lasso_coef')
plt.show()
R2:0.853814736719781
MSE:621746.8036719494
RMSE:590.9812536346216