如何标记特殊情况RandomForestRegressor在蟒蛇sklearn(How to lab

2019-10-30 12:46发布

我有一组数值特征(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处理?

我很高兴在需要时提供更多的细节?

Answer 1:

好吧,如果80-90%的不需要的优先级,你应该建立一个确定的优先级是否需要分配或不分类的,因为这将是一个倾斜的课,我会建议你使用决策树或异常检测作为分类,要求优先将是一个异常数据点,就可以使用Sklearn这些。

决定必须被分配优先级的对象后,我会考虑训练数据相对于优先级分配,你说,优先级的范围从1-100,所以如果你有至少5000个数据点,每个优先级至少有35例,我建议多类分类器(SVC与RBF核是首选),并检查矩阵的准确性,如果不工作,你将不得不使用一个回归的数据,然后一轮的混乱矩阵答案。

我基本上意思是,如果数据足够庞大,且有目标标签中均匀分布,去多类分类,如果数据不够大,去分类,如果你想代码的任何部分,让我知道。

编辑的代码

好了,所以让我们把它从顶部,首先无论是在你的目标的NA值存储为np.nan或它们被存储为喜欢的符号? 或者像直线上升文NA在所有的情况下,这将导致你的目标标签是类型的对象,检查使用df[['target']].dtypes如果它说:整数或浮点数,则可以跳过第一步,但如果它说的对象,那么我们就需要先解决这个问题。

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

这将通过每当优先分配将真正更新您的数据帧,本专栏将是你的目标你的分类。 使用注意事项 df1 ,而不是df ,掉落的Targetdf1 ,因为它并不重要,对于第一部分。 df1.drop(['Target'], axis = 1, inplace = True)

现在,我要使用随机森林分类在这一点,因为异常检测应该避免,直到类被扭曲高达98%,但你可以看它在这里。

继续前进,构建随机森林分类

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()上的新数据。 掉落在输出当属假行和其余数据运行回归。 我假设你可以做回归的部分,因为这是现在已经完全直线前进。 让我知道,如果你面对任何进一步的问题。



文章来源: How to label special cases in RandomForestRegressor in sklearn in python