python 如何在 sklearn 的 RandomForestRegressor 中标记特殊情况
How to label special cases in RandomForestRegressor in sklearn in python
对于我的数据集中的每个用户,我有一组数值特征(f1、f2、f3、f4、f5)如下。
f1 f2 f3 f4 f5
user1 0.1 1.1 0 1.7 1
user2 1.1 0.3 1 1.3 3
user3 0.8 0.3 0 1.1 2
user4 1.5 1.2 1 0.8 3
user5 1.6 1.3 3 0.3 0
我的目标输出是优先用户列表。即如下例所示。
f1 f2 f3 f4 f5 target_priority
user1 0.1 1.1 0 1.7 1 2
user2 1.1 0.3 1 1.3 3 1
user3 0.8 0.3 0 1.1 2 5
user4 1.5 1.2 1 0.8 3 3
user5 1.6 1.3 3 0.3 0 4
我想以反映用户优先级的方式使用这些功能。目前,我正在使用 sklearns
RandomForestRegressor` 来执行此任务。
然而,我最近得到了我的真实数据集,它有一些没有优先级标签的用户。那是因为这样的用户对我们公司来说并不重要(更像是一般用户)。
示例(真实数据集的样子):
f1 f2 f3 f4 f5 target_priority
user1 0.1 1.1 0 1.7 1 2
user2 1.1 0.3 1 1.3 3 2
user3 0.8 0.3 0 1.1 2 N/A
user4 1.5 1.2 1 0.8 3 N/A
user5 1.6 1.3 3 0.3 0 1
在这种特殊情况下(没有priority label
),给他们一个特殊的符号或比现有优先级低得多的优先级(例如100000000000000000 priority
)? RandomForestRegressor 是如何处理这种特殊情况的?
如果需要,我很乐意提供更多详细信息?
好的,如果 80-90% 不需要优先级,您应该构建一个 classifier 来决定是否需要分配优先级,因为这将是一个倾斜的 class, 我建议你使用决策树或异常检测作为 classifier,需要优先级的数据点将是异常,你可以使用 Sklearn 来处理这些。
确定了需要分配优先级的对象后,我会研究训练数据的优先级分布,你说优先级范围是1-100,所以如果你至少有5000个数据点并且每个优先级至少有 35 个示例,我建议使用 Multi class classifier(首选带有 rbf 内核的 SVC)和混淆矩阵来检查矩阵的准确性,如果不是的话work 你将不得不对数据使用回归器,然后对答案进行四舍五入。
我的基本意思是,如果数据足够大,并且目标标签之间分布均匀,则进行多class class化,如果数据不够大去找一个 classifier,如果你想要它的任何部分的代码,请告诉我。
编辑代码
好的,让我们从头开始,首先在您的目标 N.A 中。值存储为 np.nan
或者它们存储为像 ?
这样的符号或像 N.A.
这样的直接文本在所有情况下这将导致你的目标标签是对象类型,检查使用 df[['target']].dtypes
如果是int或者float,第一步可以跳过,但是如果是object,那我们就需要先解决了。
df.loc[df['Target'] == 'N.A.', 'Target'] = np.nan #np = Numpy `N.A.` can be any placeholder that is being used by tour dataset for N.A. values.
df[['target']] = df[['target']].astype(float)
现在让我们转到第二部分,您需要为 classifier 获取目标,为此使用
df2 = pd.DataFrame()
df2['Bool'] = df[['Target']] != np.nan
df1 = pd.concat([df, df2], axis = 1)
df1.head() #Sanity check
这将通过在分配优先级时添加 true 来更新您的数据框,此列将成为您 classifier 的目标。 注意 使用 df1
而不是 df
,现在从 df1
中删除 Target
因为它对于第一部分并不重要。 df1.drop(['Target'], axis = 1, inplace = True)
现在我将在此使用随机森林 class化,因为在 classes 倾斜高达 98% 之前应避免异常检测,但您可以查看它 here.
继续,构建随机森林 classifier
clf = RandomForestClassifier(n_estimators=100, max_depth=2) #Note max depth is a hyper parameter and you will need to tune it.
clf.fit (df1.drop(['Bool'],axis=1),df1['Bool'])
删除输出为假的行
df1 = df1[df['Bool'] == True]
然后只需对新数据使用 clf.predict()
。删除输出为 false 的行,并 运行 对剩余数据进行回归。我假设你可以做回归部分,因为现在完全是直截了当的。如果您遇到任何其他问题,请告诉我。
对于我的数据集中的每个用户,我有一组数值特征(f1、f2、f3、f4、f5)如下。
f1 f2 f3 f4 f5
user1 0.1 1.1 0 1.7 1
user2 1.1 0.3 1 1.3 3
user3 0.8 0.3 0 1.1 2
user4 1.5 1.2 1 0.8 3
user5 1.6 1.3 3 0.3 0
我的目标输出是优先用户列表。即如下例所示。
f1 f2 f3 f4 f5 target_priority
user1 0.1 1.1 0 1.7 1 2
user2 1.1 0.3 1 1.3 3 1
user3 0.8 0.3 0 1.1 2 5
user4 1.5 1.2 1 0.8 3 3
user5 1.6 1.3 3 0.3 0 4
我想以反映用户优先级的方式使用这些功能。目前,我正在使用 sklearns
RandomForestRegressor` 来执行此任务。
然而,我最近得到了我的真实数据集,它有一些没有优先级标签的用户。那是因为这样的用户对我们公司来说并不重要(更像是一般用户)。
示例(真实数据集的样子):
f1 f2 f3 f4 f5 target_priority
user1 0.1 1.1 0 1.7 1 2
user2 1.1 0.3 1 1.3 3 2
user3 0.8 0.3 0 1.1 2 N/A
user4 1.5 1.2 1 0.8 3 N/A
user5 1.6 1.3 3 0.3 0 1
在这种特殊情况下(没有priority label
),给他们一个特殊的符号或比现有优先级低得多的优先级(例如100000000000000000 priority
)? RandomForestRegressor 是如何处理这种特殊情况的?
如果需要,我很乐意提供更多详细信息?
好的,如果 80-90% 不需要优先级,您应该构建一个 classifier 来决定是否需要分配优先级,因为这将是一个倾斜的 class, 我建议你使用决策树或异常检测作为 classifier,需要优先级的数据点将是异常,你可以使用 Sklearn 来处理这些。
确定了需要分配优先级的对象后,我会研究训练数据的优先级分布,你说优先级范围是1-100,所以如果你至少有5000个数据点并且每个优先级至少有 35 个示例,我建议使用 Multi class classifier(首选带有 rbf 内核的 SVC)和混淆矩阵来检查矩阵的准确性,如果不是的话work 你将不得不对数据使用回归器,然后对答案进行四舍五入。
我的基本意思是,如果数据足够大,并且目标标签之间分布均匀,则进行多class class化,如果数据不够大去找一个 classifier,如果你想要它的任何部分的代码,请告诉我。
编辑代码
好的,让我们从头开始,首先在您的目标 N.A 中。值存储为 np.nan
或者它们存储为像 ?
这样的符号或像 N.A.
这样的直接文本在所有情况下这将导致你的目标标签是对象类型,检查使用 df[['target']].dtypes
如果是int或者float,第一步可以跳过,但是如果是object,那我们就需要先解决了。
df.loc[df['Target'] == 'N.A.', 'Target'] = np.nan #np = Numpy `N.A.` can be any placeholder that is being used by tour dataset for N.A. values.
df[['target']] = df[['target']].astype(float)
现在让我们转到第二部分,您需要为 classifier 获取目标,为此使用
df2 = pd.DataFrame()
df2['Bool'] = df[['Target']] != np.nan
df1 = pd.concat([df, df2], axis = 1)
df1.head() #Sanity check
这将通过在分配优先级时添加 true 来更新您的数据框,此列将成为您 classifier 的目标。 注意 使用 df1
而不是 df
,现在从 df1
中删除 Target
因为它对于第一部分并不重要。 df1.drop(['Target'], axis = 1, inplace = True)
现在我将在此使用随机森林 class化,因为在 classes 倾斜高达 98% 之前应避免异常检测,但您可以查看它 here.
继续,构建随机森林 classifier
clf = RandomForestClassifier(n_estimators=100, max_depth=2) #Note max depth is a hyper parameter and you will need to tune it.
clf.fit (df1.drop(['Bool'],axis=1),df1['Bool'])
删除输出为假的行
df1 = df1[df['Bool'] == True]
然后只需对新数据使用 clf.predict()
。删除输出为 false 的行,并 运行 对剩余数据进行回归。我假设你可以做回归部分,因为现在完全是直截了当的。如果您遇到任何其他问题,请告诉我。