机器学习案例:预测自行车流量——基于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)

 

你可能感兴趣的:(机器学习案例:预测自行车流量——基于Scikit-Learn)