如何在Sklearn的“随机森林分类器”中为另一个数据集使用训练好的模型?

时间:2018-12-06 12:31:53

标签: python scikit-learn classification random-forest

更新:一些“术语”
样本:行
功能:列
'labels':预测的类(功能中的一列)。

基本上我想知道: 我在形状和大小方面具有数据集1和数据集2相同。经过数据集1的训练和测试后,我正在使用此模型预测数据集2。 (功能数量也相同)。

如果我预测数据集2中的所有项目,则准确性接近数据集1测试结果。但是,如果我从数据集2的每个类中选择一项,则准确性约为30%。完全数据集2的准确性与“子采样的”数据集2完全不同的可能性如何?

我正在使用RandomForestClassifier。

我有一个包含约90个类别的200K样本(行)的数据集。经过培训和测试后,准确性足够高(约96%)。

现在,由于我拥有训练有素的模型,因此我正在使用另一个不同的数据库(同样具有20万个样本和90个类别)进行预测。

如果我从第二个数据库中提交了所有样本,那么准确性就足够接近训练准确性(约92%)。

但是,如果我从第二个数据库中选择90个样本(每个类别一个),那么我所期望的准确性就不高。 (约30%)

.... data preprocessing is done.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

from sklearn.ensemble import RandomForestClassifier
clf=RandomForestClassifier(n_estimators=nestimators, bootstrap=False, 
class_weight=None, criterion='entropy',
        max_features='auto', max_leaf_nodes=None,
        min_impurity_decrease=0.0, min_impurity_split=None,

        min_weight_fraction_leaf=0.0, n_jobs=6,
        oob_score=False, random_state=np.random.seed(1234), verbose=0, warm_start=False)
clf.fit(X_train,y_train)
y_pred=clf.predict(X_test)    

from sklearn import metrics
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))

且准确度约为〜96%。

现在,我将这个训练有素的模型与新数据库(形状相同)一起使用:

df2=pd.read_csv("newdata.csv", low_memory=False, skipinitialspace=True, na_filter=False)
features=['col1','col2','col3','col4']
Xnew=df2[features].values
ynew=df2['labels'].values  # Labels
y_prednew=clf.predict(Xnew)

精度高于〜90%。接近第一数据库的准确性。但是

如果我使用以下方法为每个类别的1个样本过滤此新数据集:

df2=pd.read_csv("newdata.csv", low_memory=False, skipinitialspace=True, na_filter=False)

samplesize=1
df2=df2.sample(frac=1)
df2=df2.groupby('labels')
df2=df2.head(samplesize).reset_index(drop=True)

features=['col1','col2','col3','col4']
Xnew=df2[features].values
ynew=df2['labels'].values  # Labels
y_prednew=clf.predict(Xnew)

... 准确度约为35%。但是,如果我不过滤这些新数据并将其提交给模型,则准确性会超过90%。

第一和第二数据集在形状方面相同。如果我将第二个数据集中的所有样本都提供给该训练模型,则Accurayc接近第一个数据集测试结果。但是,如果我对每个类别的1个样本进行过滤,则准确性约为30%。

我不知道我在哪里犯错了。

1 个答案:

答案 0 :(得分:1)

通常,代码看起来还可以。很难知道,但我会冒险猜测,这些类在数据集中的代表程度不同(至少是第二个,也许还有第一个),并且可以更准确地识别出更主导的类。

经典示例是一些极不平衡的二进制分类任务,其中99%的样本为阳性。通过始终预测为正,您可以获得99%的准确度,但是每个类的1个数据点的样本将具有50%的准确度(尽管在上下文之外,准确度似乎不错,但是该模型不是很有用)。

我建议您检查班级频率,并同时使用其他指标(请参见precisionrecallf1)和适当的average参数,以更准确地评估您的模型的性能。

总而言之,对于每个类别,整个数据集的90%+准确性和1个数据点的样本的30%准确性不一定是冲突的,例如如果类在数据集中不均衡。

编辑:简而言之,我想说的是,您可能正在体验Accuracy Paradox