Hi,这是我们第2次公开课。之所以有这个分享课程是因为大家太忙(懒),没有时间看fastai在线视频和笔记。而且视频和笔记都是英文的,大家也不想费脑子(懒)。所以本课程的目的就是把Jeremy老师的视频用中文再给大家讲一遍,另外把Hiromi小姐的笔记翻译加工一下分享给大家。
深入随机森林
Notebook
1.评估方法
1.1 RMSE定义
上回讲到调用了一个基础模型,把train数据集传入并打印了结果评分。
def rmse(x,y): return math.sqrt(((x-y)**2).mean())
这里用到了df的mean()函数,用于返回平均值。另外,由于我们已经对传入的x,y取对数了,
df_raw.SalePrice = np.log(df_raw.SalePrice)
所以这里只需要计算rmse就可以啦。
%time可以记录cpu运行的时间。根据经验来说,一般运行时间超过10秒,就无法进行互动分析了。所以在调研阶段要控制其在一个合理的运行时间。而等到下班前把当天的特征工程、参数都做得差不多了,就可以跑一长时间的试试,第二天回来再看看结果。
def print_score(m):
res = [rmse(m.predict(X_train), y_train), rmse(m.predict(X_valid), y_valid),
m.score(X_train, y_train), m.score(X_valid, y_valid)]
if hasattr(m, 'oob_score_'): res.append(m.oob_score_)
print(res)
m = RandomForestRegressor(n_jobs=-1)
%time m.fit(X_train, y_train)
print_score(m)
均方根对数误差,Root Mean Squared Logarithmic Error (RMSLE):
均方根误差,Root Mean Squared Error (RMSE):
然后我们把数据集里所有的数据都转换成数字:
add_datepart
—获取日期特征。train_cats
—转换string为pandas的category数据类型。然后调用proc_df
把所有category类型的列,都替换为其category codes值。proc_df
还可以把缺失值替换为中位数,添加[column_name]_na的列,然后通过设置其值(true/false)表示该列是否缺失值。
1.2 R²定义
**R²是什么?
yi是目标数据,ȳ 是平均值,SStot是数据的差异,fi是预测数据,SSres是实际模型的RMSE。
如果预测结果和平均值完全一样(fi=ȳ ),则SSres/SStot=1, R² = 0。
如果预测结果和实际值完全一样(fi=yi),则SSres/SStot=0, R² = 1。
其中R²的范围是1~-∞。如果值是负的,说明你的模型太差,全预测平均数也比你的模型好。
你不需要对R²进行调优,它更多是提供一个模型好坏的趋势参考。比如R²是0.8的时候模型是什么样的,R²是0.9的时候模型是什么样的。有时候可以用随机噪音数不同的数据集,创建一个2D散点图,看一下R²的值,感受一下这些和实际值的接近程度。
R²是衡量你的模型与全平均值模型的比率。总要比无脑全预测平均值要好才行啊。
https://www.graphpad.com/guides/prism/7/curve-fitting/index.htm?r2_ameasureofgoodness_of_fitoflinearregression.htm
1.3 过拟合(Overfitting)
验证集和测试集的区别?
如果只有一个数据集,然后在其上尝试了各种超参数的组合,最后模型可能会在这个数据集上过拟合。所以如果有一个验证集,我们就可以在上面验证模型是否合适。如果结果在训练集上很精确,但是在验证集上很糟糕,说明模型过拟合了,需要调整超参数。
测试集则只是用于测试最终模型的好坏的。
可以看到,R²在训练集上是0.982,在验证机是只有0.886,说明我们的模型过拟合了,但是RMSE是0.25,所以过拟合的不是特别厉害。
为什么不随机选择数据生成验证集呢?
因为数据集里的日期是一个重要数据,如果任意选择一些日期组成验证集,实际上对于预测的计算来说就变得更容易了,因为我们要预测后面日期的数据,在训练集里已经出现了差不多日期的数据了,验证集里日期相近的数据很容易就能预测出来。但是对于测试集,用的是单独的日期期间的数据,预测结果就不会太好了。结论就是,通常如果建立的模型包含日期元素