常德车管所网站,南京 高端网站制作,公司域名注册查询,专业的手机网站建设公司排名第1关#xff1a;数据探索与可视化 任务描述
本关任务#xff1a;编写python代码#xff0c;完成一天中不同时间段的平均租赁数量的可视化功能。
相关知识
为了完成本关任务#xff0c;你需要掌握#xff1a;
读取数据数据探索与可视化
读取数据
数据保存在./step1/…
第1关数据探索与可视化 任务描述
本关任务编写python代码完成一天中不同时间段的平均租赁数量的可视化功能。
相关知识
为了完成本关任务你需要掌握
读取数据数据探索与可视化
读取数据
数据保存在./step1/bike_train.csv中共享单车的训练集数据总共有8709个训练样本训练样本中有12个特征(其中count为标签)。特征说明如下
datetime时间。年月日小时格式season季节。1春天2夏天3秋天4冬天holiday是否节假日。0否1是workingday是否工作日。0否1是weather天气。1晴天2阴天3小雨或小雪4恶劣天气temp实际温度atemp体感温度humidity湿度windspeed风速casual未注册用户租车数量registered注册用户租车数量count总租车数量
想要读取数据很简单使用pandas即可代码如下 import pandas as pdtrain_df pd.read_csv(./step1/bike_train.csv)# 打印数据中的前5行print(train_df.head(5))
输出如下图所示 数据探索与可视化
一般拿到数据之后都需要做数据探索(EDA)因为我们需要看看数据到底长什么样子有什么特性是可以挖掘出来的。假设我们需要看看数据的大概分布是什么样的。可以用pandas提供的describe()函数。输出如下 此时我们能看到count的标准差很大我们可以将count的数据分布可视化出来代码如下 import matplotlib.pyplot as pltplt.figure(figsize(10,10))# 画count的直方图plt.hist(train_df[count],bins20)plt.title(count histgram)plt.xlabel(count)
可视化结果如下 从可视化结果可以看出count的整体的分布倾斜比较严重需要处理一下不然可能过拟合会有点严重。此时我们可以考虑将count的数值在3个标准差之外的样本给扔掉减少训练集中的噪声并对count做log变换。代码如下 import matplotlib.pyplot as pltimport numpy as npimport seaborn as sns# 筛选3个标准差以内的数据train_dftrain_df[np.abs(train_df[count]-train_df[count].mean())3*train_df[count].std()]# log变换ytrain_df[count].valuesy_lognp.log(y)# 可视化sns.distplot(y_log)plt.title(distribution of count after log)
处理后可视化结果如下 可以从可视化结果看出转换过后count的分布倾斜没有那么严重了差异也变小了。
接下来我们看看其他的一些特征对于共享单车租赁量的影响。
首先来看看季节对于租赁量的影响代码如下 day_dftrain_df.groupby(date).agg({season:mean,casual:sum, registered:sum,count:sum,temp:mean,atemp:mean,workingday:mean,holiday:mean})season_day_meanday_df.groupby([season],as_indexTrue).agg({casual:mean, registered:mean,count:mean})temp_df day_df.groupby([season], as_indexTrue).agg({temp:mean, atemp:mean})season_day_mean.plot(figsize(15,9),xticksrange(1,4))plt.title(count in different season)
可视化结果如下 从可视化结果可以看出临时用户和注册用户用车数量变化趋势大体一致且两年间都在秋季左右达到了比较高的用车辆说明美国人也都比较喜欢在这段时间外出游玩。这是符合常理的。
接下来看看天气对租赁数量的影响代码如下 weather_grouptrain_df.groupby([weather])weather_countweather_group[[count,registered,casual]].count()weather_meanweather_group[[count,registered,casual]].mean()# 不同天气的每小时平均租赁数量weather_mean.plot.bar(stackedTrue,titlecount per hour in different weather)
可视化结果如下 讲道理天气比较好的时侯骑共享单车的人才比较多。但上图中像4(恶劣天气)这种天气的租赁数量也比较高这是不是有点反常呢我们可以从数据集中找出对应的数据看看代码如下: print(train_df.loc[train_df.weather4])
数据结果如下 数据的时间是下午6点刚好是下班的高峰期所以能够理解为什么这条数据对应的租赁量均值那么高了这也是符合常理的。
那么一天中不同时间段对于租赁数量有什么样的影响呢这个就留给你做练习吧。
编程要求
根据提示在右侧编辑器Begin-End处补充代码将./step1/bike_train.csv中的数据按照hour这个特征分组然后求每一组的count的平均值。并使用matplotlib.pyplot绘制折线图并保存到./step1/result/plot.png。
测试说明
平台会对你生成的折线图与正确答案进行比对因此请按照以下要求可视化
折线图的figsize为(10, 10)折线图的标题为average count per hour
测试输入 预期输出你的答案与正确答案一致
import pandas as pd
import matplotlib
matplotlib.use(Agg)
import matplotlib.pyplot as plt#********* Begin *********#
import pandas as pdimport matplotlib.pyplot as plttrain_df pd.read_csv(./step1/bike_train.csv)train_df[hour] train_df.datetime.apply(lambda x:x.split()[1].split(:)[0]).astype(int)group_hourtrain_df.groupby(train_df.hour)hour_meangroup_hour[[count,registered,casual]].mean()figplt.figure(figsize(10,10))plt.plot(hour_mean[count])plt.title(average count per hour)plt.savefig(./step1/result/plot.png)#********* End *********#第2关特征工程
任务描述
本关任务编写python代码完成时间细化的功能。
相关知识
为了完成本关任务你需要掌握
相关性分析特征选择
相关性分析
在选择特征之前我们可以看看各个特征相关性的强弱。代码如下 # 计算特征对的相关性corr_dftrain_df.corr()corr_df1abs(corr_df)# 画热力图figplt.gcf()fig.set_size_inches(30,12)sns.heatmap(datacorr_df1,squareTrue,annotTrue,cbarTrue)
相关性热力图如下(其中颜色越亮代表线性相关性越高) 选择特征
在使用相关性这一指标来选择特征时通常选择相关性较低也就是颜色较暗的特征。因为如果选择相关性较高的比如temp和atemp。从图可以看出这两个特征的相关性很高也就是说在训练模型的时候这两个特征所对应的权重是成比例的。既然成比例那么之选其中一个就行了。
根据热力图我们暂且可以选择时段hour、温度temp、湿度humidity、季节season、天气weather、风速windspeed、是否工作日workingday、是否假日holiday 、注册用户租赁数量(registered)作为特征。
编程要求
现在可能觉得datetime这个字段有必要再细化挖掘一下比如细化成年份、月份、日期、星期几等。
根据提示在右侧编辑器Begin-End处补充代码实现transform_data函数。该函数需要你将train_df中的datetime字段进行细化细化成year(年份)、month(月份)、date(日期)、weekdat(星期几)、hour(小时)。并返回细化后的DataFrame。
例如原始数据如下 细化后数据如下: 测试说明
平台会对你返回的DataFrame与答案进行比对您只需实现transform_data即可。
测试输入 预期输出你的答案与正确答案一致。
import pandas as pd
import numpy as np
from datetime import datetimedef transform_data(train_df):将train_df中的datetime划分成year、month、date、weekday、hour:param train_df:从bike_train.csv中读取的DataFrame:return:无#********* Begin *********#train_df[date] train_df.datetime.apply(lambda x:x.split()[0])train_df[hour] train_df.datetime.apply(lambda x:x.split()[1].split(:)[0]).astype(int)train_df[year] train_df.datetime.apply(lambda x:x.split()[0].split(-)[0]).astype(int)train_df[month] train_df.datetime.apply(lambda x: x.split()[0].split(-)[1]).astype(int)train_df[weekday] train_df.date.apply(lambda x: datetime.strptime(x, %Y-%m-%d).isoweekday())return train_df#********* End **********#第3关租赁需求预估
任务描述
本关任务编写python代码实现租赁需求预估。
相关知识
为了完成本关任务你需要掌握
独热编码sklearn机器学习算法的使用生成预测结果
独热编码
一般来说代表类型型的特征我们需要对其进行独热编码。像数据中季节这种类别型的特征应该使用独热编码。因为如果使用原始的1、2、3、4的话机器学习算法可能会认为4这个季节更重要。为了防止这种偏见我们就需要对其进行独热编码。
独热编码其实很简单就是将待编码的特征的所有可能的取值列出来然后再在对应的位置上填1其他位置填0。可以看成是二进制的一种变形。
比如有4个样本的season分别为2、2、2、1。如下图所示 那么将其独热编码后如下图所示(第1行到第3行的season2所以编码后每行的season_2这一列为1其他列为0。而第4行的season1所以编码后season_1这一列为1其他列为0) 代码如下 import pandas as pd# 将train_df中的season这一列进行独热编码dummies_season pd.get_dummies(train_df[season], prefixseason)# 打印print(dummies_season)
sklearn机器学习算法的使用
sklearn中提供了非常多的机器学习算法的接口例如逻辑回归、弹性网络、随机森林等等。而且使用起来非常简单只需要fit、predict二连即可。而本关是对共享单车的租赁需求量做预测所以这是一个回归问题。在这里给出sklearn解决回归问题的示例代码 from sklearn.linear_model import Ridge# 实例化Ridge回归对象ridge Ridge(alpha1.0)# 使用训练集的数据和标签训练ridge.fit(train_df, train_label)# 对测试集数据进行预测pred_result ridge.predict(test_df)
生成预测结果
想要将预测结果保存到文件中可以使用pandas来实现示例代码如下: import pandas as pd# 构建DataFramepred_result为机器学习算法的预测结果result pd.DataFrame({count:pred_result})# 将DataFrame保存成result.csv并且保存时不保留indexresult.to_csv(./result.csv, indexFalse)
编程要求
根据提示在右侧编辑器补充代码。代码主要任务如下
读取./step3/bike_train.csv中的数据作为训练集读取./step3/bike_test.csv中的数据作为测试集将数据处理成你想要的样子使用sklearn对训练集数据进行训练并对测试集进行预测将预测结果保存至./step3/result.csv
测试说明
平台会计算你保存的./step3/result.csv的r2 score。若r2 score高于0.95视为过关。
测试输入 预期输出你的预测结果的r2 score高于0.95
PS:./step3/result.csv中需要两列。一列为datetime另一列为count。其中datetime为./step3/bike_test.csv中的datetimecount为你的预测结果。如 #********* Begin *********#
import pandas as pd
import numpy as np
from datetime import datetime
from sklearn.linear_model import Ridge
train_df pd.read_csv(./step3/bike_train.csv)
# 舍弃掉异常count
train_dftrain_df[np.abs(train_df[count]-train_df[count].mean())3*train_df[count].std()]
# 训练集的时间数据处理
train_df[date]train_df.datetime.apply(lambda x:x.split()[0])
train_df[hour]train_df.datetime.apply(lambda x:x.split()[1].split(:)[0]).astype(int)
train_df[year]train_df.datetime.apply(lambda x:x.split()[0].split(-)[0]).astype(int)
train_df[month]train_df.datetime.apply(lambda x:x.split()[0].split(-)[1]).astype(int)
train_df[weekday]train_df.date.apply( lambda x : datetime.strptime(x,%Y-%m-%d).isoweekday())
# 独热编码
train_df_backtrain_df
dummies_month pd.get_dummies(train_df[month], prefixmonth)
dummies_year pd.get_dummies(train_df[year], prefixyear)
dummies_season pd.get_dummies(train_df[season], prefixseason)
dummies_weather pd.get_dummies(train_df[weather], prefixweather)
train_df_back pd.concat([train_df, dummies_month,dummies_year, dummies_season,dummies_weather], axis 1)
train_label train_df_back[count]
train_df_back train_df_back.drop([datetime, season, weather, atemp, date, month, count], axis1)
test_df pd.read_csv(./step3/bike_test.csv)
# 测试集的时间数据处理
test_df[date]test_df.datetime.apply(lambda x:x.split()[0])
test_df[hour]test_df.datetime.apply(lambda x:x.split()[1].split(:)[0]).astype(int)
test_df[year]test_df.datetime.apply(lambda x:x.split()[0].split(-)[0]).astype(int)
test_df[month]test_df.datetime.apply(lambda x:x.split()[0].split(-)[1]).astype(int)
test_df[weekday]test_df.date.apply( lambda x : datetime.strptime(x,%Y-%m-%d).isoweekday())
# 独热编码
test_df_backtest_df
dummies_month pd.get_dummies(test_df[month], prefixmonth)
dummies_year pd.get_dummies(test_df[year], prefixyear)
dummies_season pd.get_dummies(test_df[season], prefixseason)
dummies_weather pd.get_dummies(test_df[weather], prefixweather)
test_df_back pd.concat([test_df, dummies_month,dummies_year, dummies_season,dummies_weather], axis 1)
test_df_back test_df_back.drop([datetime, season, weather, atemp, date, month], axis1)
clf Ridge(alpha1.0)
# 训练
clf.fit(train_df_back, train_label)
# 预测
count clf.predict(test_df_back)
# 保存结果
result pd.DataFrame({datetime:test_df[datetime], count:count})
result.to_csv(./step3/result.csv, indexFalse)
#********* End *********#