我的数据看起来是这样的…
date,locale,category,site,alexa_rank,sessions,user_logins20170110,US,1,google,1,500,500020170110,EU,1,google,2,400,200020170111,US,2,facebook,2,400,2000
… 等等。这只是我编造的一个玩具数据集,但它与原始数据相似。
我正在尝试构建一个模型,使用sklearn的RandomForestRegressor
来预测特定网站的用户登录和会话数量。
我做了通常的操作,将类别编码为标签,并且我已经用这一年的前八个月的数据训练了模型,现在我想预测第九个月的登录和会话。我为登录和会话分别训练了两个模型。
我的测试数据集形式相同:
date,locale,category,site,alexa_rank,sessions,user_logins20170910,US,1,google,1,500,500020170910,EU,1,google,2,400,200020170911,US,2,facebook,2,400,2000
理想情况下,我希望在不包含需要预测的列的情况下传入测试数据集,但RandomForestRegressor抱怨训练集和测试集之间的维度不同。
当我以当前形式传入测试数据集时,模型在大多数情况下预测了sessions
和user_logins
列中的确切值,其他情况下预测的值略有不同。
我在测试数据中将sessions
和user_logins
列置零,并将其传递给模型,但模型预测的几乎都是零。
- 我的工作流程正确吗?我正确使用了RandomForestRegressor吗?
- 当我的测试数据集中包含实际值时,我为什么能得到如此接近实际值的结果?测试数据中的实际值是否被用于预测?
- 如果模型工作正常,当我将要预测的列(
sessions
和user_logins
)置零时,不应该得到相同的值吗?
回答:
你不应该在测试数据中传入你想要预测的列。你的工作流程是不正确的。
如果X
是你拥有的信息的列集,y
是你想要预测的信息的列集,那么在训练过程中(使用fit
方法)你应该传入(X_train
, y_train
),在测试过程中(使用predict
方法)只传入(X_test
,)。你将获得y_pred
,如果你有y_test
,你可以将其与y_test
进行比较。
在你的例子中,如果你想预测user_logins
:
X_train = array([['20170110', 'US', '1', 'google', '1', '500'], ['20170110', 'EU', '1', 'google', '2', '400'], ['20170111', 'US', '2', 'facebook', '2', '400']], dtype='<U21')y_train = array(['5000', '2000', '2000'], dtype='<U21')X_test = array([['20170112', 'EU', '2', 'google', '1', '500'], ['20170113', 'US', '1', 'facebook', '2', '400'], ['2017014', 'US', '2', 'google', '1', '500']], dtype='<U21')estimator = RandomForestRegressor().fit(X_train, y_train)y_pred = estimator.predict(X_test)