如何在python中的sklearn中在RandomForestRegressor中标记特殊情况

时间:2019-02-24 06:15:05

标签: machine-learning scikit-learn random-forest

我为数据集中的每个用户提供了一组数字特征(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中如何处理这种特殊情况?

如果需要,我很乐意提供更多详细信息?

1 个答案:

答案 0 :(得分:1)

好的,如果80-90%不需要优先级,则应该构建一个分类器来确定是否需要分配优先级,因为这将是一个偏斜的类,因此我建议您使用决策树或异常检测作为分类器,需要优先级的数据点将是异常,可以使用Sklearn进行处理。

在确定必须分配优先级的对象之后,我将研究关于优先级的训练数据的分布,您说优先级的范围是1-100,因此,如果您至少有5,000个数据点,每个优先级级别至少有35个示例,我建议使用多类分类器(最好使用具有rbf内核的SVC)和混淆矩阵来检查矩阵的准确性,如果这样做不起作用,则必须在数据上使用回归器然后四舍五入。

我的基本意思是,如果数据足够大,并且目标标签之间的分布均匀,则进行多类分类;如果数据不够大,则进行分类器;如果您需要任何部分的代码让我知道。

编辑代码

好吧,让我们从顶部开始,首先在目标中将NA值存储为np.nan,或者将它们存储为符号,例如?或直接文本,例如N.A.在所有情况下,这都会导致目标标签的类型为object,要检查使用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)

现在让我们进入第二部分,您需要获取分类器的目标才能使用

df2 = pd.DataFrame()
df2['Bool'] = df[['Target']] != np.nan
df1 =  pd.concat([df, df2], axis = 1)
df1.head() #Sanity check

这将通过在分配优先级时添加true来更新数据框,此列将作为您分类器的目标。 通知使用df1而不是df,现在从第一部分中将Targetdf1中删除,因为它并不重要。 df1.drop(['Target'], axis = 1, inplace = True)

现在我将在这里使用随机森林分类,因为应该避免异常检测,直到类倾斜到98%,但是您可以查看它here.

继续,以构建随机森林分类器

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的行,并对其余数据运行回归器。我假设您可以执行回归器部分,因为现在完全可以直接执行了。让我知道您是否还有其他问题。