机器学习案例:预测自行车流量——基于Scikit-Learn

《Python数据科学手册》笔记

(因为没有下载到数据集,只能纸上谈兵的总结一下过程(o(╥﹏╥)o))

针对这个例子,首先要明确任务,细分目标;然后准备数据集并提取相应特征;最后选择模型进行训练与预测。另外,如果预测效果不好,还得认真分析原因

一、明确目标,细分任务

       首先要明确,我们的目的是预测自行车流量,而从经验来看,自行车流量可能与季节、天气、气温,是否为节假日,甚至白昼时间长短等因素有关系。因此我们可以探究自行车流量与以上因素的关系。不过,我们并没有现成的准备得妥妥当当的数据集,因此,我们还需要进行下一步:准备数据集。

二、准备数据集

       首先需要一个自行车流量统计数据(日期+流量),季节、是否为节假日、白昼时间长短可通过自行车流量统计数据集的日期和pandas自带的日历模块进行转换求解,而天气和气温则需要再下载一个数据集。需要注意的是,自行车流量和天气、气温数据必须采自于同一个地方(城市),且日期要对齐。书上的案例下载了两个数据集:“每天经过美国西雅图弗莱蒙特桥上自行车的数量”数据集、“西雅图每日天气预报”数据集。

三、提取特征

       1.首先加载两个数据集,用日期做索引,计算每一天的自行车流量,将结果放到一个新的DataFrame中。

       2.考虑到自行车流量可能是按周变化(周中上班、周末不上班),因此将周一至周日单独成列。

       3.根据日期计算当天是否为节假日,增加一列表示当天是否为节假日。

       4.根据日期计算白昼时间,增加一列表示当天的白昼时间。

       5.从天气预报数据集中可以计算每天的平均气温和总降雨量,特别地,再增加一个标记表示是否下雨,将这些特征都用新列表示。

四、选择模型进行训练及预测

       选择线性回归模型,将整理好的训练集用模型进行训练,然后对不带标签(去除自行车流行列)的数据进行预测,对比自行车真实流量与预测流量。

五、根据结果对以上过程进行相应改善

       结果是预测效果一般。那么,很有可能是因为特征没有收集全,还有其它因素会影响人们是否骑车:

      ①变量的非线性影响因素没有体现。降雨和寒冷天气的体现。

      ②非线性趋势没有体现。人们在温度过高或过低时可能都不愿意骑车。

      ③丢掉了一些细腻度的数据。下雨天的早晨和下雨天的傍晚直接的差异。

      ④忽略了相邻日期彼此间的相关性。下雨的星期二对星期三的骑车人数的影响或者滂沱大雨之后意外的雨过天晴对骑车人数的影响。

六、重要代码

1.加载数据集,用日期作索引:

counts = pd.read_csv('fremont_hourly.csv',index_col='Date',parse_dates=True) #自行车流量数据集
weather = pd.read_csv('599021.csv',index_col='DATE',parse_dates=True) #天气预报数据集

2.增加星期X列

days = ['Mon','Tue','Wed','Tue','Fri','Sat','Sun']
for i in range(7):
    daily[days[i]] = (daily.index.dayofweek == i).astype(float)

3.增加是否为节假日列

from pandas.tseries.holiday import USFederalHolidayCalendar
cal = USFederalHolidayCalendar()
holidays = cal.holidays('2012','2016') #数据集是2012~2016年之间的数据
daily = daily.join(pd.Series(1,index=holidays,name='holiday'))
daily['holiday'].fillna(0,inplace=True) #以0填充缺失值

4.增加白昼时间列

def hours_of_daylight(date,axis=23.44,latitude=47.61):
    days = (date - pd.datetime(2000,12,21)).days
    m = (1. - np.tan(np.radians(latitude))*np.tan(np.radians(axis)*np.cos(days*2*np.pi/365.25)))
    return 24.*np.degrees(np.arccos(1-np.clip(m,0,2)))/180.
daily['daylight_hrs'] = list(map(hours_of_daylight,daily.index))

(剩下的特征列省略)

5.训练及预测

column_names = ['Mon','Tue','Wed','Tue','Fri','Sat','Sun','holiday','daylight_hrs','PRCP','dry day','Temp(C)','annual']
X = daily[column_names]
y = daily['Total']
from sklearn.linear_model import LinearRegression
model = LinearRegression(fit_intercept=False)
model.fit(X,y)
daily['predicted'] = model.predict(X)

 

  • 2
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
作业一(Matlab) 假设x=(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20),y=( 2.94, 4.53, 5.96, 7.88, 9.02, 10.94, 12.14, 13.96, 14.74, 16.68, 17.79, 19.67, 21.20, 22.07, 23.75, 25.22, 27.17, 28.84, 29.84, 31.78).请写出拟合的直线方程,并画图(包括原数据点及拟合的直线),请打印出来。 请使用线性回归模型来拟合bodyfat数据。数据集介绍可阅读:https://www.mathworks.com/help/nnet/examples/body-fat-estimation.html 在matlab中,在命令行中输入[X,Y] = bodyfat_dataset; 即可获得一个拥有13个属性,252个样本的数据集。使用前200个样本来获得模型,并写出你所获得的模型。使用后52个样本做测试,汇报你所获得的泛化误差。 编程实现对数回归,并给出教材89页上的西瓜数据集3.0上的结果。要求采用4折交叉验证法来评估结果。因为此处一共17个样本,你可以去掉最后一个样本,也可以用所有数据,然后测试用5个样本。在汇报结果时,请说明你的选择。请在二维图上画出你的结果(用两种不同颜色或者形状来标注类别),同时打印出完整的代码。 作业二 采用信息增益准则,基于表4.2中编号为1、2、3、6、7、9、10、14、15、16、17的11个样本的色泽、根蒂、敲声、文理属性构建决策树。(本次作业可以用笔算,鼓励编程实现,但都需要列出主要步骤,其中log2(3)=1.585,log2(5)=2.322,log2(6)=2.585,log2(7)=2.807,log2(9)=3.17,log2(10)=3.322,log2(11)=3.459) 用表4.2中编号为4、5、8、11、12、13的样本做测试集,对上题的训练数据采用预剪枝策略构建决策树,并汇报验证集精度。 用表4.2中编号为4、5、8、11、12、13的样本做测试集,对题1所构建的决策树进行后剪枝,并汇报验证集精度。 作业三(Matlab) 试编程实现累积BP算法,在西瓜数据集2.0上(用训练数据)训练一个单隐层网络,用验证集计算出均方误差。要自己实现,不能直接调用现成的库函数。 作业四 下载并安装libsvm,http://www.csie.ntu.edu.tw/~cjlin/libsvm/ ,在西瓜数据集3.0a上分别用线性核训练一个SVM。用正类1-6和负类9-14作为训练集,其余作为测试集。C取不同的值,其它参数设为默认值。作出测试正确率随C取值变化的图,C=[1 100 10000 10^6 10^8]。 换成高斯核(宽度设为1),重复上题的步骤。 作业五 以西瓜数据集2.0(见教材76页表4.1)中样本1--16为训练集训练一个朴素贝叶斯分类器,对测试样本17进行分类。请写出详细的计算过程。 假设x_k是一个班上学生的分数,对应的分数及其分布是 x_1=30, P1=0.5,一共有14个学生; x_2=18, P2=mu,有6个学生; x_3=20, P3=2mu,有9个学生; x_4=23, P4=0.5-3mu,有10个学生; 通过最大对数似然法求出mu的值。 作业六(Python) 1 使用PCA对Yale人脸数据集进行降维,并分别观察前20、前100个特征向量所对应的图像。请随机选取3张照片来对比效果。数据集http://vision.ucsd.edu/content/yale-face-database

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值