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

How to use trained model for another dataset in Sklearn's Random Forest Classifier?

更新:一些 "Terminology "
样本:行
特征:列
'labels' : classes 用于预测(特征中的一列)。

基本上我想知道: 我有 dataset1 和 dataset2 在形状和大小方面相同。在使用数据集 1 进行训练和测试后,我正在使用该模型来预测数据集 2。 (特征数量也相同)。

如果我预测 dataset2 中的所有项目,准确性接近 dataset1 测试结果。但是如果我从数据集 2 中为每个 class 选择 1 个项目,准确度约为 30%。完整数据集 2 的准确度怎么可能与 "subsampled" 数据集 2 大不相同?

我正在使用 RandomForestClassifier。

我有一个包含 200K 个样本(行)的数据集,大约有 90 classes。经过训练和测试,准确率足够高(大约 96%)。

现在因为我有一个经过训练的模型,我正在使用另一个不同的数据库(同样有 200 K 个样本和 90 classes)来进行预测。

如果我提交来自第二个数据库的所有样本,准确度足够接近训练准确度(大约 92%)。

但是如果我从第二个数据库中 select 90 个样本(每个 class 一个),准确性不是我所期望的。 (大约 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% 以上。接近第一个数据库的准确性。但是

如果我为每个 class 的 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 接近于第一个数据集的测试结果。但如果我从每个 class 中过滤 1 个样本,准确度约为 30%。

我不知道我哪里弄错了

大体上代码似乎没问题。很难知道,但我会冒昧地猜测 classes 在数据集中的表现不尽相同(至少第二个,也许也是第一个),而且占主导地位的 classes 更多准确识别。

classic 示例是一些极度不平衡的二进制 classification 任务,其中 99% 的样本都是正样本。通过始终预测正数,您可以获得 99% 的准确度,但是每个 class 的 1 个数据点样本将具有 50% 的准确度(虽然脱离上下文时准确度可能看起来不错,但该模型不是很有用).

我建议检查 class 频率,并使用其他指标(参见 precision, recall and f1)和适当的 average 参数来更准确地评估模型的性能。

总而言之,整个数据集的 90%+ 准确度和每个 class 的 1 个数据点样本的 30% 准确度不一定冲突,例如如果 classes 在数据集中不平衡。

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