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



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

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

"TruetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalset
FalsetTruetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalset
FalsetFalsetTruetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalset
FalsetFalsetFalsetTruetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalset
FalsetFalsetFalsetFalsetTruetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalset
FalsetFalsetFalsetFalsetFalsetTruetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalset
FalsetFalsetFalsetFalsetFalsetFalsetTruetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalset
FalsetFalsetFalsetFalsetFalsetFalsetFalsetTruetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalset
FalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetTruetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsetFalsen" 

同时,我尝试用(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)

提前感谢!

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

您是否尝试在此数据上拟合线性模型(例如逻辑回归)作为基线?

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

scikit随机森林分类器可以使用虚拟变量,但它也可以直接使用分类变量,这是首选的方法。把字符串映射成整数。假设你的特征向量是['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,而不需要做伪化

最新更新