kaggle共享单车数据分析及预测(随机森林)

文章目录

  • 一、数据收集
    • 1.1、项目说明
    • 1.2、数据内容及变量说明
  • 二、数据处理
    • 2.1、导入数据
    • 2.2、缺失值处理
    • 2.3、Label数据(即count)异常值处理
    • 2.4、其他数据异常值处理
    • 2.5、时间型数据数据处理
  • 三、数据分析
    • 3.1 描述性分析
    • 3.2、探索性分析
      • 3.2.1、整体性分析
      • 3.2.2、相关性分析
      • 3.2.3、影响因素分析
        • 3.2.3.1、时段对租赁数量的影响
        • 3.2.3.2、温度对租赁数量的影响
        • 3.2.3.3、 湿度对租赁数量的影响
        • 3.2.3.4、年份、月份对租赁数量的影响
        • 3.2.3.5、季节对出行人数的影响
        • 3.2.3.6、天气情况对出行情况的影响
        • 3.2.3.7、风速对出行情况的影响
        • 3.2.3.8、日期对出行的影响
    • 3.3、预测性分析
      • 3.3.1、选择特征值
      • 3.3.2、训练集、测试集分离
      • 3.3.3、多余特征值舍弃
      • 3.3.4、选择模型、训练模型
      • 3.3.5、预测测试集数据

一、数据收集

1.1、项目说明

自行车共享系统是一种租赁自行车的方法,注册会员、租车、还车都将通过城市中的站点网络自动完成,通过这个系统人们可以根据需要从一个地方租赁一辆自行车然后骑到自己的目的地归还。在这次比赛中,参与者需要结合历史天气数据下的使用模式,来预测D.C.华盛顿首都自行车共享项目的自行车租赁需求。

1.2、数据内容及变量说明

比赛提供了跨越两年的每小时租赁数据,包含天气信息和日期信息,训练集由每月前19天的数据组成,测试集是每月第二十天到当月底的数据。
在这里插入图片描述

二、数据处理

2.1、导入数据

import matplotlib.pyplot as pltimport seaborn as sns
sns.set(style='whitegrid' , palette='tab10')train=pd.read_csv(r'D:\A\Data\ufo\train.csv',encoding='utf-8')
train.info()test=pd.read_csv(r'D:\A\Data\ufo\test.csv',encoding='utf-8')
print(test.info())

在这里插入图片描述

2.2、缺失值处理

#可视化查询缺失值
import missingno as msno
msno.matrix(train,figsize=(12,5))
msno.matrix(test,figsize=(12,5))

在这里插入图片描述
本次数据没有缺失值,不需要进行缺失值处理。

2.3、Label数据(即count)异常值处理

#观察训练集数据描述统计
train.describe().T

在这里插入图片描述
先从数值型数据入手,可以看出租赁额(count)数值差异大,再观察一下它们的密度分布:

#观察租赁额密度分布
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
fig.set_size_inches(6,5)sns.distplot(train['count'])
ax.set(xlabel='count',title='Distribution of count',)

在这里插入图片描述
发现数据密度分布的偏斜比较严重,且有一个很长的尾,所以希望能把这一列数据的长尾处理一下,先排除掉3个标准差以外的数据试一下能不能满足要求

train_WithoutOutliers = train[np.abs(train['count']-train['count'].mean())<=(3*train['count'].std())] 
print(train_WithoutOutliers.shape)
train_WithoutOutliers['count'] .describe()

在这里插入图片描述
与处理前对比不是很明显,可视化展示对比看一下:

fig = plt.figure()
ax1 = fig.add_subplot(1, 2, 1)
ax2 = fig.add_subplot(1, 2, 2)
fig.set_size_inches(12,5)sns.distplot(train_WithoutOutliers['count'],ax=ax1)
sns.distplot(train['count'],ax=ax2)ax1.set(xlabel='count',title='Distribution of count without outliers',)
ax2.set(xlabel='registered',title='Distribution of count')

在这里插入图片描述
可以看到数据波动依然很大,而我们希望波动相对稳定,否则容易产生过拟合,所以希望对数据进行处理,使得数据相对稳定,此处选择对数变化,来使得数据稳定。

yLabels=train_WithoutOutliers['count']
yLabels_log=np.log(yLabels)
sns.distplot(yLabels_log)

在这里插入图片描述
经过对数变换后数据分布更均匀,大小差异也缩小了,使用这样的标签对训练模型是有效果的。接下来对其余的数值型数据进行处理,由于其他数据同时包含在两个数据集中,为方便数据处理先将两个数据集合并。

Bike_data=pd.concat([train_WithoutOutliers,test],ignore_index=True)
#查看数据集大小
Bike_data.shape

在这里插入图片描述

2.4、其他数据异常值处理

fig, axes = plt.subplots(2, 2)
fig.set_size_inches(12,10)sns.distplot(Bike_data['temp'],ax=axes[0,0])
sns.distplot(Bike_data['atemp'],ax=axes[0,1])
sns.distplot(Bike_data['humidity'],ax=axes[1,0])
sns.distplot(Bike_data['windspeed'],ax=axes[1,1])axes[0,0].set(xlabel='temp',title='Distribution of temp',)
axes[0,1].set(xlabel='atemp',title='Distribution of atemp')
axes[1,0].set(xlabel='humidity',title='Distribution of humidity')
axes[1,1].set(xlabel='windspeed',title='Distribution of windspeed')

在这里插入图片描述
通过这个分布可以发现一些问题,比如风速为什么0的数据很多,而观察统计描述发现空缺值在1–6之间,从这里似乎可以推测,数据本身或许是有缺失值的,但是用0来填充了,但这些风速为0的数据会对预测产生干扰,希望使用随机森林根据相同的年份,月份,季节,温度,湿度等几个特征来填充一下风速的缺失值。填充之前看一下非零数据的描述统计。

Bike_data[Bike_data['windspeed']!=0]['windspeed'].describe()

在这里插入图片描述

from sklearn.ensemble import RandomForestRegressorBike_data["windspeed_rfr"]=Bike_data["windspeed"]
# 将数据分成风速等于0和不等于两部分 
dataWind0 = Bike_data[Bike_data["windspeed_rfr"]==0]
dataWindNot0 = Bike_data[Bike_data["windspeed_rfr"]!=0]
#选定模型
rfModel_wind = RandomForestRegressor(n_estimators=1000,random_state=42)
# 选定特征值
windColumns = ["season","weather","humidity","month","temp","year","atemp"]
# 将风速不等于0的数据作为训练集,fit到RandomForestRegressor之中
rfModel_wind.fit(dataWindNot0[windColumns], dataWindNot0["windspeed_rfr"])
# 通过训练好的模型预测风速
wind0Values = rfModel_wind.predict(X= dataWind0[windColumns])
#将预测的风速填充到风速为零的数据中
dataWind0.loc[:,"windspeed_rfr"] = wind0Values
#连接两部分数据
Bike_data = dataWindNot0.append(dataWind0)
Bike_data.reset_index(inplace=True)
Bike_data.drop('index',inplace=True,axis=1)

观察随机森林填充后的密度分布情况

fig, axes = plt.subplots(2, 2)
fig.set_size_inches(12,10)sns.distplot(Bike_data['temp'],ax=axes[0,0])
sns.distplot(Bike_data['atemp'],ax=axes[0,1])
sns.distplot(Bike_data['humidity'],ax=axes[1,0])
sns.distplot(Bike_data['windspeed_rfr'],ax=axes[1,1])axes[0,0].set(xlabel='temp',title='Distribution of temp',)
axes[0,1].set(xlabel='atemp',title='Distribution of atemp')
axes[1,0].set(xlabel='humidity',title='Distribution of humidity')
axes[1,1].set(xlabel='windseed',title='Distribution of windspeed')

在这里插入图片描述

2.5、时间型数据数据处理

Bike_data['date']=Bike_data.datetime.apply( lambda c : c.split( )[0])
Bike_data['hour']=Bike_data.datetime.apply( lambda c : c.split( )[1].split(':')[0]).astype('int')
Bike_data['year']=Bike_data.datetime.apply( lambda c : c.split( )[0].split('/')[0]).astype('int')
Bike_data['month']=Bike_data.datetime.apply( lambda c : c.split( )[0].split('/')[1]).astype('int')
Bike_data['weekday']=Bike_data.date.apply( lambda c : datetime.strptime(c,'%Y/%m/%d').isoweekday())
Bike_data.head()

在这里插入图片描述

三、数据分析

3.1 描述性分析

train.describe().T

在这里插入图片描述
温度, 体表温度, 相对湿度, 风速均近似对称分布, 而非注册用户, 注册用户,以及总数均右边分布。

for i in range(5, 12):name = train.columns[i]print('{0}偏态系数为 {1}, 峰态系数为 {2}'.format(name, train[name].skew(), train[name].kurt()))

在这里插入图片描述
temp, atemp, humidity低度偏态, windspeed中度偏态, casual, registered, count高度偏态;
temp, atemp, humidity为平峰分布, windspeed,casual, registered, count为尖峰分布。

3.2、探索性分析

3.2.1、整体性分析

sns.pairplot(Bike_data ,x_vars=['holiday','workingday','weather','season','weekday','hour','windspeed_rfr','humidity','temp','atemp'] ,y_vars=['casual','registered','count'] , plot_kws={'alpha': 0.1})

在这里插入图片描述
大致可以看出:

  1. 会员在工作日出行多,节假日出行少,临时用户则相反;
  2. 一季度出行人数总体偏少;
  3. 租赁数量随天气等级上升而减少;
  4. 小时数对租赁情况影响明显,会员呈现两个高峰,非会员呈现一个正态分布;
  5. 租赁数量随风速增大而减少;
  6. 温度、湿度对非会员影响比较大,对会员影响较小。

3.2.2、相关性分析

查看各个特征与每小时租车总量(count)的相关性

correlation = Bike_data.corr()
mask = np.array(correlation)
mask[np.tril_indices_from(mask)] = False
fig,ax= plt.subplots()
fig.set_size_inches(20,10)
sns.heatmap(correlation, mask=mask,vmax=.8, square=True,annot=True)plt.show()

在这里插入图片描述
count 和 registered、casual高度正相关,相关系数分别为0.7 与0.97。因为 count = casual + registered ,所以这个正相关和预期相符。count 和 temp 正相关,相关系数为 0.39。一般来说,气温过低人们不愿意骑车出行。count 和 humidity(湿度)负相关,湿度过大的天气不适宜骑车。当然考虑湿度的同时也应该考虑温度。windspeed似乎对租车人数影响不大(0.1),但我们也应该考虑到极端大风天气出现频率应该不高。风速在正常范围内波动应该对人们租车影响不大。可以看出特征值对租赁数量的影响力度为,时段>温度>湿度>年份>月份>季节>天气等级>风速>星期几>是否工作日>是否假日

3.2.3、影响因素分析

3.2.3.1、时段对租赁数量的影响

workingday_df=Bike_data[Bike_data['workingday']==1]
workingday_df = workingday_df.groupby(['hour'], as_index=True).agg({'casual':'mean','registered':'mean','count':'mean'})nworkingday_df=Bike_data[Bike_data['workingday']==0]
nworkingday_df = nworkingday_df.groupby(['hour'], as_index=True).agg({'casual':'mean','registered':'mean', 'count':'mean'})
fig, axes = plt.subplots(1, 2,sharey = True)workingday_df.plot(figsize=(15,5),title = 'The average number of rentals initiated per hour in the working day',ax=axes[0])
nworkingday_df.plot(figsize=(15,5),title = 'The average number of rentals initiated per hour in the nonworkdays',ax=axes[1])

在这里插入图片描述
通过对比可以看出:

  1. 工作日对于会员用户上下班时间是两个用车高峰,而中午也会有一个小高峰,猜测可能是外出午餐的人;
  2. 而对临时用户起伏比较平缓,高峰期在17点左右;
  3. 并且会员用户的用车数量远超过临时用户。
  4. 对非工作日而言租赁数量随时间呈现一个正态分布,高峰在14点左右,低谷在4点左右,且分布比较均匀。

3.2.3.2、温度对租赁数量的影响

先观察温度的走势

#数据按小时统计展示起来太麻烦,希望能够按天汇总取一天的气温中位数
temp_df = Bike_data.groupby(['date','weekday'], as_index=False).agg({'year':'mean','month':'mean','temp':'median'})#由于测试数据集中没有租赁信息,会导致折线图有断裂,所以将缺失的数据丢弃
temp_df.dropna ( axis = 0 , how ='any', inplace = True )
#预计按天统计的波动仍然很大,再按月取日平均值
temp_month = temp_df.groupby(['year','month'], as_index=False).agg({'weekday':'min','temp':'median'})
#将按天求和统计数据的日期转换成datetime格式
temp_df['date']=pd.to_datetime(temp_df['date'])#将按月统计数据设置一列时间序列
temp_month.rename(columns={'weekday':'day'},inplace=True)
temp_month['date']=pd.to_datetime(temp_month[['year','month','day']])#设置画框尺寸
fig = plt.figure(figsize=(18,6))
ax = fig.add_subplot(1,1,1)#使用折线图展示总体租赁情况(count)随时间的走势
plt.plot(temp_df['date'] , temp_df['temp'] , linewidth=1.3 , label='Daily average')
ax.set_title('Change trend of average temperature per day in two years')
plt.plot(temp_month['date'] , temp_month['temp'] , marker='o', linewidth=1.3 ,label='Monthly average')
ax.legend()                                                                  

在这里插入图片描述
可以看出每年的气温趋势相同随月份变化,在7月份气温最高,1月份气温最低,再看一下每小时平均租赁数量随温度变化的趋势。

#按温度取租赁额平均值
temp_rentals = Bike_data.groupby(['temp'], as_index=True).agg({'casual':'mean', 'registered':'mean','count':'mean'})
temp_rentals .plot(title = 'The average number of rentals initiated per hour changes with the temperature')

在这里插入图片描述
可观察到随气温上升租车数量总体呈现上升趋势,但在气温超过35时开始下降,在气温4度时达到最低点。

3.2.3.3、 湿度对租赁数量的影响

先观察湿度的走势:

4humidity_df = Bike_data.groupby('date', as_index=False).agg({'humidity':'mean'})
humidity_df['date']=pd.to_datetime(humidity_df['date'])
#将日期设置为时间索引
humidity_df=humidity_df.set_index('date')humidity_month = Bike_data.groupby(['year','month'], as_index=False).agg({'weekday':'min','humidity':'mean'})
humidity_month.rename(columns={'weekday':'day'},inplace=True)
humidity_month['date']=pd.to_datetime(humidity_month[['year','month','day']])fig = plt.figure(figsize=(18,6))
ax = fig.add_subplot(1,1,1)
plt.plot(humidity_df.index , humidity_df['humidity'] , linewidth=1.3,label='Daily average')
plt.plot(humidity_month['date'], humidity_month['humidity'] ,marker='o', linewidth=1.3,label='Monthly average')
ax.legend()
ax.set_title('Change trend of average humidity per day in two years')

在这里插入图片描述
湿度的变化幅度不是很大,多数围绕60上下浮动,本次数据范围内峰值为80。

humidity_rentals = Bike_data.groupby(['humidity'], as_index=True).agg({'casual':'mean','registered':'mean','count':'mean'})
humidity_rentals .plot (title = 'Average number of rentals initiated per hour in different humidity')

在这里插入图片描述
可以观察到在湿度20左右租赁数量迅速达到高峰值,此后缓慢递减。

3.2.3.4、年份、月份对租赁数量的影响

观察两年时间里,总租车数量随时间变化的趋势

#数据按小时统计展示起来太麻烦,希望能够按天汇总
count_df = Bike_data.groupby(['date','weekday'], as_index=False).agg({'year':'mean','month':'mean','casual':'sum','registered':'sum','count':'sum'})
#由于测试数据集中没有租赁信息,会导致折线图有断裂,所以将缺失的数据丢弃
count_df.dropna ( axis = 0 , how ='any', inplace = True )#预计按天统计的波动仍然很大,再按月取日平均值
count_month = count_df.groupby(['year','month'], as_index=False).agg({'weekday':'min','casual':'mean', 'registered':'mean','count':'mean'})#将按天求和统计数据的日期转换成datetime格式
count_df['date']=pd.to_datetime(count_df['date'])#将按月统计数据设置一列时间序列
count_month.rename(columns={'weekday':'day'},inplace=True)
count_month['date']=pd.to_datetime(count_month[['year','month','day']])#设置画框尺寸
fig = plt.figure(figsize=(18,6))
ax = fig.add_subplot(1,1,1)#使用折线图展示总体租赁情况(count)随时间的走势
plt.plot(count_df['date'] , count_df['count'] , linewidth=1.3 , label='Daily average')
ax.set_title('Change trend of average number of rentals initiated  per day in two years')
plt.plot(count_month['date'] , count_month['count'] , marker='o', linewidth=1.3 , label='Monthly average')
ax.legend()

在这里插入图片描述
可以看出:

  1. 共享单车的租赁情况2012年整体是比2011年有增涨的;
  2. 租赁情况随月份波动明显;
  3. 数据在2011年9到12月,2012年3到9月间波动剧烈;
  4. 有很多局部波谷值。

3.2.3.5、季节对出行人数的影响

在对年份月份因素的数据分析图中发现存在很多局部低谷,所以将租赁数量按季节取中位数展示,同时观察季节的温度变化

day_df=Bike_data.groupby('date').agg({'year':'mean','season':'mean','casual':'sum', 'registered':'sum','count':'sum','temp':'mean','atemp':'mean'})season_df = day_df.groupby(['year','season'], as_index=True).agg({'casual':'mean', 'registered':'mean','count':'mean'})season_df .plot(figsize=(18,6),title = 'The trend of average number of rentals initiated per day changes with season')

在这里插入图片描述

temp_df = day_df.groupby(['year','season'], as_index=True).agg({'temp':'mean', 'atemp':'mean'})
temp_df.plot(figsize=(18,6),title = 'The trend of average temperature per day changes with season')

在这里插入图片描述
可以看出无论是临时用户还是会员用户用车的数量都在秋季迎来高峰,而春季度用户数量最低。

3.2.3.6、天气情况对出行情况的影响

考虑到不同天气的天数不同,例如非常糟糕的天气(4)会很少出现,查看一下不同天气等级的数据条数,再对租赁数量按天气等级取每小时平均值。

count_weather = Bike_data.groupby('weather')
count_weather[['casual','registered','count']].count()

在这里插入图片描述

weather_df = Bike_data.groupby('weather', as_index=True).agg({'casual':'mean','registered':'mean'})
weather_df.plot.bar(stacked=True,title = 'Average number of rentals initiated per hour in different weather')

在这里插入图片描述
此处存在不合理数据:天气等级4的时候出行人数并不少,尤其是会员出行人数甚至比天气等级2的平均值还高,按理说4等级的应该是最少的,将天气等级4的数据打印出来找一下原因:

Bike_data[Bike_data['weather']==4]

在这里插入图片描述
观察可知该数据是在上下班高峰期产生的,所以该数据是个异常数据。不具有代表性。

3.2.3.7、风速对出行情况的影响

两年时间内风速的变化趋势

windspeed_df = Bike_data.groupby('date', as_index=False).agg({'windspeed_rfr':'mean'})
windspeed_df['date']=pd.to_datetime(windspeed_df['date'])
#将日期设置为时间索引
windspeed_df=windspeed_df.set_index('date')windspeed_month = Bike_data.groupby(['year','month'], as_index=False).agg({'weekday':'min','windspeed_rfr':'mean'})
windspeed_month.rename(columns={'weekday':'day'},inplace=True)
windspeed_month['date']=pd.to_datetime(windspeed_month[['year','month','day']])fig = plt.figure(figsize=(18,6))
ax = fig.add_subplot(1,1,1)
plt.plot(windspeed_df.index , windspeed_df['windspeed_rfr'] , linewidth=1.3,label='Daily average')
plt.plot(windspeed_month['date'], windspeed_month['windspeed_rfr'] ,marker='o', linewidth=1.3,label='Monthly average')
ax.legend()
ax.set_title('Change trend of average number of windspeed  per day in two years')

在这里插入图片描述
可以看出风速在2011年9月份和2011年12月到2012年3月份间波动和大,观察一下租赁人数随风速变化趋势,考虑到风速特别大的时候很少,如果取平均值会出现异常,所以按风速对租赁数量取最大值。


windspeed_rentals = Bike_data.groupby(['windspeed'], as_index=True).agg({'casual':'max', 'registered':'max','count':'max'})
windspeed_rentals .plot(title = 'Max number of rentals initiated per hour in different windspeed')

在这里插入图片描述
可以看到租赁数量随风速越大租赁数量越少,在风速超过30的时候明显减少,但风速在风速40左右却有一次反弹,打印数据找一下反弹原因:

df2=Bike_data[Bike_data['windspeed']>40]
df2=df2[df2['count']>400]
df2

在这里插入图片描述
该条数据产生在上下班高峰期时期,所以也是个异常值,不具有代表性。

3.2.3.8、日期对出行的影响

考虑到相同日期是否工作日,星期几,以及所属年份等信息是一样的,把租赁数据按天求和,其它日期类数据取平均值


day_df = Bike_data.groupby(['date'], as_index=False).agg({'casual':'sum','registered':'sum','count':'sum', 'workingday':'mean','weekday':'mean','holiday':'mean','year':'mean'})
day_df.head()

在这里插入图片描述

6number_pei=day_df[['casual','registered']].mean()
number_pei

在这里插入图片描述

plt.axes(aspect='equal')  
plt.pie(number_pei, labels=['casual','registered'], autopct='%1.1f%%', pctdistance=0.6 , labeldistance=1.05 , radius=1 )  
plt.title('Casual or registered in the total lease')

在这里插入图片描述
工作日
由于工作日和休息日的天数差别,对工作日和非工作日租赁数量取了平均值,对一周中每天的租赁数量求和

workingday_df=day_df.groupby(['workingday'], as_index=True).agg({'casual':'mean', 'registered':'mean'})
workingday_df_0 = workingday_df.loc[0]
workingday_df_1 = workingday_df.loc[1]# plt.axes(aspect='equal')
fig = plt.figure(figsize=(8,6)) 
plt.subplots_adjust(hspace=0.5, wspace=0.2)     #设置子图表间隔
grid = plt.GridSpec(2, 2, wspace=0.5, hspace=0.5)   #设置子图表坐标轴 对齐plt.subplot2grid((2,2),(1,0), rowspan=2)
width = 0.3       # 设置条宽p1 = plt.bar(workingday_df.index,workingday_df['casual'], width)
p2 = plt.bar(workingday_df.index,workingday_df['registered'], width,bottom=workingday_df['casual'])
plt.title('Average number of rentals initiated per day')
plt.xticks([0,1], ('nonworking day', 'working day'),rotation=20)
plt.legend((p1[0], p2[0]), ('casual', 'registered'))plt.subplot2grid((2,2),(0,0))
plt.pie(workingday_df_0, labels=['casual','registered'], autopct='%1.1f%%', pctdistance=0.6 , labeldistance=1.35 , radius=1.3)
plt.axis('equal') 
plt.title('nonworking day')plt.subplot2grid((2,2),(0,1))
plt.pie(workingday_df_1, labels=['casual','registered'], autopct='%1.1f%%', pctdistance=0.6 , labeldistance=1.35 , radius=1.3)
plt.title('working day')
plt.axis('equal') 

在这里插入图片描述

weekday_df= day_df.groupby(['weekday'], as_index=True).agg({'casual':'mean', 'registered':'mean'})
weekday_df.plot.bar(stacked=True , title = 'Average number of rentals initiated per day by weekday')

在这里插入图片描述
对比图可发现:

  1. 工作日会员用户出行数量较多,临时用户出行数量较少;
  2. 周末会员用户租赁数量降低,临时用户租赁数量增加。

节假日
由于节假日在一年中数量占比非常少,先来看一每年的节假日下有几天:

holiday_coun=day_df.groupby('year', as_index=True).agg({'holiday':'sum'})
holiday_coun

在这里插入图片描述
假期的天数占一年天数的份额十分少,所以对假期和非假期取日平均值

holiday_df = day_df.groupby('holiday', as_index=True).agg({'casual':'mean', 'registered':'mean'})
holiday_df.plot.bar(stacked=True , title = 'Average number of rentals initiated per day by holiday or not')

在这里插入图片描述
节假日会员或非会员使用量都比非节假日多,符合规律。

3.3、预测性分析

3.3.1、选择特征值

根据前面的观察,决定将时段(hour)、温度(temp)、湿度(humidity)、年份(year)、月份(month)、季节(season)、天气等级(weather)、风速(windspeed_rfr)、星期几(weekday)、是否工作日(workingday)、是否假日(holiday),11项作为特征值。由于CART决策树使用二分类,所以将多类别型数据使用one-hot转化成多个二分型类别

dummies_month = pd.get_dummies(Bike_data['month'], prefix= 'month')
dummies_season=pd.get_dummies(Bike_data['season'],prefix='season')
dummies_weather=pd.get_dummies(Bike_data['weather'],prefix='weather')
dummies_year=pd.get_dummies(Bike_data['year'],prefix='year')
#把5个新的DF和原来的表连接起来
Bike_data=pd.concat([Bike_data,dummies_month,dummies_season,dummies_weather,dummies_year],axis=1)

3.3.2、训练集、测试集分离

dataTrain = Bike_data[pd.notnull(Bike_data['count'])]
dataTest= Bike_data[~pd.notnull(Bike_data['count'])].sort_values(by=['datetime'])
datetimecol = dataTest['datetime']
yLabels=dataTrain['count']
yLabels_log=np.log(yLabels)

3.3.3、多余特征值舍弃


dropFeatures = ['casual' , 'count' , 'datetime' , 'date' , 'registered' ,'windspeed' , 'atemp' , 'month','season','weather', 'year' ]dataTrain = dataTrain.drop(dropFeatures , axis=1)
dataTest = dataTest.drop(dropFeatures , axis=1)

3.3.4、选择模型、训练模型

rfModel = RandomForestRegressor(n_estimators=1000 , random_state = 42)rfModel.fit(dataTrain , yLabels_log)preds = rfModel.predict( X = dataTrain)

3.3.5、预测测试集数据

predsTest= rfModel.predict(X = dataTest)submission=pd.DataFrame({'datetime':datetimecol , 'count':[max(0,x) for x in np.exp(predsTest)]})submission.to_csv(r'D:\A\Data\ufo\/bike_predictions.csv',index=False)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474896.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode MySQL 197. 上升的温度

文章目录1. 题目2. 解题1. 题目 给定一个 Weather 表&#xff0c;编写一个 SQL 查询&#xff0c;来查找与之前&#xff08;昨天的&#xff09;日期相比温度更高的所有日期的 Id。 --------------------------------------------- | Id(INT) | RecordDate(DATE) | Temperature…

c 语言输出后不关闭_穿书+娱乐圈 |再不跑路就要被迫C位出道了花瓶女配和影帝组CP后豪门娇美人是爽文剧本...

书单再不跑路就要被迫C位出道了花瓶女配和影帝组CP后豪门娇美人是爽文剧本1再不跑路就要被迫C位出道了作者&#xff1a;墨流霜文案&#xff1a;顾星染一觉醒来发现自己是某小说炮灰&#xff0c;未来会嫁给某女主爱慕者&#xff0c;度过悲惨的下半生。她为了逆天改命&#xff0c…

基于FPGA的图像处理(一)--System Generator介绍

计算机视觉系统通常需要进行大量的信息处理才能够得到所需要的信息。目前主要有CPU、GPU、ASIC、DSP、FPGA等计算平台。 常用的计算机视觉系统通过通用计算机进行视觉信息处理&#xff0c;但是&#xff0c;由于CPU的计算能力有限&#xff0c;对于一些计算复杂度很高的视觉算法&…

营销组合(4P营销)分析案例:采用SPSS+Excel进行分析

文章目录1、研究目的&#xff1a;营销决策2、研究内容&#xff1a;营销组合分析2.1规模预测分析2.1.1 预测思路与方法2.1.2季节分解法预测市场规模2.2 产品属性分析2.2.1 KANO模型基本思想2.2.2 KANO模型的数据分析步骤2.2.2.1 数据准备2.2.2.2 Better—Worse系数矩阵2.3 定价决…

LeetCode MySQL 1445. 苹果和桔子

文章目录1. 题目2. 解题1. 题目 表: Sales ------------------------ | Column Name | Type | ------------------------ | sale_date | date | | fruit | enum | | sold_num | int | ------------------------ (sale_date,fruit) 是该表主…

台达plc自由口通讯_台达PLC和ABB机器人Devicenet通讯

之前有经常遇见台达PLC和第三方机器人进行Devicenet通讯&#xff0c;故作以下整理&#xff0c;方便再次使用。以台达模块DVPDNET-SL与ABB IRC5通讯为例&#xff0c;方法如下&#xff1a;1.硬件连线将PLC模块端和Robot端按照引脚定义接好网线。2.设定模块地址。3.设定模块通讯速…

电子商城战略分析(采用定性与定量分析方法)

文章目录研究目的&#xff1a;战略选择研究内容&#xff1a;环境分析宏观环境分析市场环境分析竞争环境分析定性与定量分析方法定性&#xff1a;SWOT分析定量&#xff1a;内外因素评价矩阵内外因素数据获取内外因素得分计算评分的计算权重的计算最终得分的计算制作战略选择矩阵…

LeetCode MySQL 1393. 股票的资本损益

文章目录1. 题目2. 解题1. 题目 Stocks 表&#xff1a; ------------------------ | Column Name | Type | ------------------------ | stock_name | varchar | | operation | enum | | operation_day | int | | price | int | ------------…

厂办大集体改制不签字_许昌二印,磨砂技术被外国觊觎,老工人说烂在肚子里也不外漏...

仓库租赁成为学习班和俱乐部场所市区计划改造提升老厂院10个&#xff0c;许昌市第二印刷厂有其一。今天&#xff0c;我们一起了解&#xff0c;许昌市第二印刷厂。当时&#xff0c;全国仅三家印刷厂能印制磨砂烟盒&#xff0c;市第二印刷厂位列其中。(你当年抽的磨砂许昌的包装&…

Kaggle:Video Game Sales电子游戏销售分析(Tableau展示)

文章目录项目介绍分析思路导图数据导入数据探索数据展示项目介绍 项目来源&#xff1a;Kaggle&#xff1b; 项目介绍&#xff1a;由vgchartz.com的一个刮版生成的&#xff0c;有一份综合的游戏行业销售数据&#xff0c;希望产生一份综合的游戏行业报告&#xff1b; 数据介绍&a…

LeetCode MySQL 1204. 最后一个能进入电梯的人(累加/变量/窗口函数)

文章目录1. 题目2. 解题1. 题目 表: Queue ---------------------- | Column Name | Type | ---------------------- | person_id | int | | person_name | varchar | | weight | int | | turn | int | ---------------------- person_id 是这个…

facenet训练自己的数据_①如何帮助自己简易分析体测数据②没有私教一个人无法开始训练?...

我们进健身房后&#xff0c;办卡以后&#xff0c;会有教练联系免费帮你做检测&#xff0c;检测后会拿出一张纸&#xff0c;聊完天&#xff0c;你就拿出一张卡&#xff0c;抱着一两个月我就会有巨大改变的决心&#xff0c;你辛苦赚的万八千就消失了&#xff0e;这张纸真的有这么…

Power Bi:零售数据可视化

文章目录理解数据含义确定需要解决的问题根据问题新建度量值确定背景、主题、字体及字体大小结果展示理解数据含义 本次可视化共有四张表&#xff0c;根据数据说明文档选择自己需要的特征&#xff0c;不需要的数据列隐藏。 确定需要解决的问题 根据问题新建度量值 确定背景…

excel打开csv错误换行_「乱吐槽·乱学习」excel高手捷径:一招鲜,吃遍天③

大家好&#xff0c;我是阿乱。话说三十而立&#xff0c;至于立的是什么玩意儿就见仁见智吧(≧∇≦)&#xff89;&#xff0c;不过旗杆什么的先放下来哈&#xff0c;咱们这里说的是身上得有多几个技能&#xff0c;好让我们立于不败之地嘛。当然也欢迎年轻人加入啦&#xff0c;反…

LeetCode MySQL 1308. 不同性别每日分数总计(累加/变量/窗口函数)

文章目录1. 题目2. 解题1. 题目 表: Scores ------------------------ | Column Name | Type | ------------------------ | player_name | varchar | | gender | varchar | | day | date | | score_points | int | -----------------------…

Power Bi:DAX函数总结

文章目录日期与时间函数筛选器函数逻辑判断函数逻辑函数统计函数文本函数日期与时间函数 1.计算年初至今累计--TOTALYTD函数例如计算年初至今累计的销售金额&#xff1a; [年累计金额]&#xff1a; TOTALYTD([销售金额],日历年[日期]) # 如果要加上一个时间截止点&#xff0c;…

MySql:函数总结

文章目录字符串函数数学函数日期和时间函数流程函数其他函数字符串函数 数学函数 日期和时间函数 流程函数 其他函数

endnote怎么和word关联_endnote x9怎么和word关联?Word中用EndNote X9教程

刚刚接触EndNote X9这款文献写作管理软件&#xff0c;不能熟练的在Word中用EndNote X9引入文献&#xff0c;不知道endnote x9怎么和word关联。这里小编为大家带来了Word中用EndNote X9教程&#xff0c;一起来看看吧&#xff01;下载安装好 word2019与endnote X9打开系统偏好设置…

[Hands On ML] 6. 决策树

文章目录1. 训练与可视化2. 分类预测3. 模型参数4. 回归5. 不稳定性本文为《机器学习实战&#xff1a;基于Scikit-Learn和TensorFlow》的读书笔记。 中文翻译参考 《统计学习方法》决策树笔记 决策树可以分类&#xff0c;也可以回归&#xff0c;还有多输出任务 是随机森林的基…

LeetCode MySQL 1459. 矩形面积

文章目录1. 题目2. 解题1. 题目 表: Points ------------------------ | Column Name | Type | ------------------------ | id | int | | x_value | int | | y_value | int | ------------------------ id 是该表主键. 每个点都表示…