Python 2.7 Python中的分类和随机林:无论预测值如何,预测都是相同的
我正在处理一个由5个变量和~90k观测值组成的小数据集。我已经尝试过拟合一个随机森林分类器,它模仿了iris的例子。然而,我的挑战是我的预测值都是相同的:0。我不熟悉Python,但熟悉R。不确定这是一个编码错误,还是这意味着我的数据是垃圾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
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会更快),但值以任意顺序返回。当您在下一行中对它们进行索引时,这将成为一个问题。