如何使用虚拟变量来表示python scikit中的分类数据 - 学习随机森林

时间:2013-04-04 21:08:55

标签: python scikit-learn scikits dummy-data

我正在为scikit-learn的随机森林分类器生成特征向量。特征向量代表9个蛋白质氨基酸残基的名称。有20个可能的残留名称。所以,我使用20个虚拟变量来表示一个残基名称,对于9个残基,我有180个虚拟变量。

例如,如果滑动窗口中的9个残基是:ARNDCQEGH(每个字母代表一个蛋白质残基的名称),我的特征向量将是:

"True\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\t
False\tTrue\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\t
False\tFalse\tTrue\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\t
False\tFalse\tFalse\tTrue\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\t
False\tFalse\tFalse\tFalse\tTrue\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\t
False\tFalse\tFalse\tFalse\tFalse\tTrue\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\t
False\tFalse\tFalse\tFalse\tFalse\tFalse\tTrue\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\t
False\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tTrue\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\t
False\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tTrue\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\tFalse\n" 

另外,我尝试使用(1,0)替换(True,False)

在训练和测试Scikit的随机森林分类器模型后,我发现它完全不起作用。但是Scikit的随机森林可以与我的其他数据一起使用。

Scikit的随机森林可以处理分类变量还是虚拟变量?如果是这样,你能举例说明它是如何运作的。

以下是我设置随机森林的方法:

clf=RandomForestClassifier (n_estimators=800, criterion='gini', n_jobs=12, max_depth=None, compute_importances=True, max_features='auto', min_samples_split=1,  random_state=None)

提前多多感谢!

2 个答案:

答案 0 :(得分:2)

Scikits随机森林分类器可以使用dummified变量,但它也可以直接使用分类变量,这是首选方法。只需将字符串映射为整数即可。 假设你的特征向量是['a','b','b','c']

vals = ['a','b','b','c']
#create a map from your variable names to unique integers:
intmap = dict([(val, i) for i, val in enumerate(set(vals))]) 
#make the new array hold corresponding integers instead of strings:
new_vals = [intmap[val] for val in vals]

new_vals现在保存值[0,2,2,1],您可以直接将其提供给RF,而无需进行虚假化

答案 1 :(得分:2)

使用编码为0和1的布尔特征应该有效。如果预测准确性很差,即使你的森林中有大量的决策树,也可能是你的数据太嘈杂而无法使学习算法无法获得任何有趣的想法。

您是否尝试过将线性模型(例如Logistic回归)作为此数据的基线?

编辑:在实践中,对分类变量使用整数编码往往对许多随机决策树模型(例如scikit-learn中的RandomForest和ExtraTrees)非常有效。