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

Posted

技术标签:

【中文标题】如何在python中的sklearn中标记RandomForestRegressor中的特殊情况【英文标题】:How to label special cases in RandomForestRegressor in sklearn in python 【发布时间】:2019-07-17 20:36:06 【问题描述】:

我的数据集中的每个用户都有一组数字特征(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

我想以反映用户优先级的方式使用这些功能。目前,我正在使用sklearnsRandomForestRegressor`来执行这个任务。

但是,我最近得到了我的真实数据集,它有一些没有优先级标签的用户。那是因为这样的用户对我们公司来说并不重要(更像是普通用户)。

示例(真实数据集的样子):

       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 中如何处理此类特殊情况?

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

【问题讨论】:

在您的数据集中,有多少 % 的样本带有标签 N/A 那我建议你做2个模型。首先预测一个样本是 Priority 还是 Non-priority。然后使用带有 Priority 标签的数据来预测target_priority 是的。或者您的数据较少,假设 15-20%,那么您可以将其用作不同的类别。 目标标签中的 80-90% NA 或者这是否还包括输入特征中的值? 优先级也在固定范围内变化,即从 1-10 变化,或者它是可变的,意味着它可以无限变化? 【参考方案1】:

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

在确定必须分配优先级的对象后,我将研究训练数据在优先级方面的分布,您说优先级的范围是 1-100,所以如果您至少有 5,000 个数据点并且每个优先级至少有 35 个示例,我建议使用多类分类器(首选带有 rbf 内核的 SVC)和混淆矩阵来检查矩阵的准确性,如果这不起作用你将不得不对数据使用回归器然后将答案四舍五入。

我的基本意思是,如果数据足够大,并且目标标签之间分布均匀,则使用多类分类,如果数据不够大,则使用分类器,如果您想要任何部分的代码告诉我吧。

编辑代码

好的,让我们从顶部开始,首先在您的目标中,NA 值存储为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)

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

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

这将通过在分配优先级时添加 true 来更新您的数据框,此列将成为您分类器的目标。 注意使用df1 而不是df,现在从df1 中删除Target,因为它并不重要,对于第一部分。 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 的行,并对剩余数据运行回归器。我假设你可以做回归部分,因为这现在完全是直截了当的。如果您遇到任何其他问题,请告诉我。

【讨论】:

非常感谢您的出色回答。如果你能告诉我如何做这部分Decision tree or Anomaly Detection as classifier,那就太好了,因为我以前没有处理过倾斜的数据。其他部分我很清楚如何去做。期待您的回音。再次感谢您:) 期待您的回音:) 非常感谢。如果您可以使用那部分代码更新答案,那就太好了。我不着急。星期五对我来说很好。 :) 非常感谢。这很有帮助。是的,我对回归器部分比较熟悉 :) 只是一个简单的问题。当我做一些阅读时,我遇到了两个名为 undersamplingoversampling 的概念。使用 randomforestclassifier 时,undersampling/oversampling 会自动发生吗?再次非常感谢:) @Emi no 它不会自动发生,但randomforestclassifier 会计算每个决策树中的特征重要性和整体特征重要性,从而减少使用欠采样/过采样来平衡数据集的需要。 P.S.:除非万不得已,否则我不会推荐过采样/欠采样,因为在某些可能会被删除的非常具体的情况下,即使是多数类也会被发现 :)

以上是关于如何在python中的sklearn中标记RandomForestRegressor中的特殊情况的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 中的 sklearn 中的不同管道中获取特征名称

如何在 python 中的 sklearn 中获取 GridSearchCV 中的选定功能

如何在 python 中的 SVM sklearn 数据中绘制决策边界?

我应该如何理解 python-sklearn 中的 .transform 方法?

sklearn - PCA 的标签点

Python - SkLearn Imputer 用法