Python 2.7 Python中的分类和随机林:无论预测值如何,预测都是相同的

Python 2.7 Python中的分类和随机林:无论预测值如何,预测都是相同的,python-2.7,scikit-learn,Python 2.7,Scikit Learn,我正在处理一个由5个变量和~90k观测值组成的小数据集。我已经尝试过拟合一个随机森林分类器,它模仿了iris的例子。然而,我的挑战是我的预测值都是相同的:0。我不熟悉Python,但熟悉R。不确定这是一个编码错误,还是这意味着我的数据是垃圾 from sklearn.ensemble import RandomForestClassifier data = train_df[cols_to_keep] data = data.join(dummySubTypes.ix[:, 1:]) data

我正在处理一个由5个变量和~90k观测值组成的小数据集。我已经尝试过拟合一个随机森林分类器,它模仿了iris的例子。然而,我的挑战是我的预测值都是相同的:0。我不熟悉Python,但熟悉R。不确定这是一个编码错误,还是这意味着我的数据是垃圾

from sklearn.ensemble import RandomForestClassifier
data = train_df[cols_to_keep]
data = data.join(dummySubTypes.ix[:, 1:])
data = data.join(dummyLicenseTypes.ix[:, 1:])
data['is_train'] = np.random.uniform(0, 1, len(data)) <= .75
#data['type'] = pd.Categorical.from_codes(data['type'],["Type1","Type2"])
data.head()
Mytrain, Mytest = data[data['is_train']==True], data[data['is_train']==False]
Myfeatures = data.columns[1:5] # string of feature names: subtype dummy     variables
rf = RandomForestClassifier(n_jobs=2)
y, _ = pd.factorize(Mytrain['type'])
rf.fit(Mytrain[Myfeatures], y)
data.target_names = np.asarray(list(set(data['type'])))
preds = data.target_names[rf.predict(Mytest[Myfeatures])]
更新: 前几行数据:

In[670]: Mytrain[Myfeatures].head()
Out[669]: 
subtype_INDUSTRIAL  subtype_INSTITUTIONAL  subtype_MULTIFAMILY  \
0                   0                      0                    0   
1                   0                      0                    0   
2                   0                      0                    0   
3                   0                      0                    0   
4                   0                      0                    0   

subtype_SINGLE FAMILY / DUPLEX  
0                               0  
1                               0  
2                               0  
3                               1  
4                               1 
当我预测培训输入时,我只得到一个类的预测:

In[675]: np.bincount(rf.predict(Mytrain[Myfeatures]))
Out[674]: array([    0, 75091])

您的代码有几个问题,但最突出的是:

data.target_names = np.asarray(list(set(data['type'])))
preds = data.target_names[rf.predict(Mytest[Myfeatures])]
Python中的集合本质上是无序的,因此不能保证在这个操作之后预测会被正确标记

以下是您的代码的清理版本:

# build your data
data = train_df[cols_to_keep]
data = data.join(dummySubTypes.ix[:, 1:])
data = data.join(dummyLicenseTypes.ix[:, 1:])

# split into training/testing sets
from sklearn.cross_validation import train_test_split
train, test = train_test_split(data, train_size=0.75)

# fit the classifier; scikit-learn factorizes labels internally
features = data.columns[1:5]
target = 'type'
rf = RandomForestClassifier(n_jobs=2)
rf.fit(train[features], train[target])

# predict and compute confusion matrix
preds = rf.predict(test[features])
print(pd.crosstab(test[target], preds,
                  rownames=['actual'],
                  colnames=['preds']))

如果结果仍然不如您预期的那样,我建议您使用scikit learn的工具对随机林进行一些超参数优化。

您的代码有几个问题,但最突出的问题是:

data.target_names = np.asarray(list(set(data['type'])))
preds = data.target_names[rf.predict(Mytest[Myfeatures])]
Python中的集合本质上是无序的,因此不能保证在这个操作之后预测会被正确标记

以下是您的代码的清理版本:

# build your data
data = train_df[cols_to_keep]
data = data.join(dummySubTypes.ix[:, 1:])
data = data.join(dummyLicenseTypes.ix[:, 1:])

# split into training/testing sets
from sklearn.cross_validation import train_test_split
train, test = train_test_split(data, train_size=0.75)

# fit the classifier; scikit-learn factorizes labels internally
features = data.columns[1:5]
target = 'type'
rf = RandomForestClassifier(n_jobs=2)
rf.fit(train[features], train[target])

# predict and compute confusion matrix
preds = rf.predict(test[features])
print(pd.crosstab(test[target], preds,
                  rownames=['actual'],
                  colnames=['preds']))

如果结果仍然不如您预期的那样,我建议您使用scikit learn的工具对随机林进行一些超参数优化。

非常感谢您的建议。绝对是我在书中找不到的东西。我来看看你的建议。Re:你关于集合无序的评论,我试图从列表中根据这里的流行答案获取唯一值:你会说这是一个不正确的答案吗?这当然是获取唯一值的有效方法(虽然np.unique会更快),但值以任意顺序返回。当你在下一行对它们进行索引时,这就成了一个问题。非常感谢你的建议。绝对是我在书中找不到的东西。我来看看你的建议。Re:你关于集合无序的评论,我试图从列表中根据这里的流行答案获取唯一值:你会说这是一个不正确的答案吗?这当然是获取唯一值的有效方法(虽然np.unique会更快),但值以任意顺序返回。当您在下一行中对它们进行索引时,这将成为一个问题。