我使用smote来平衡Model train的输出(y),但希望使用原始数据测试模型,因为它使我们如何使用smote创建的输出测试模型成为逻辑。如果我没有解释清楚,请随时提出澄清。这是我的开始堆栈溢出
from imblearn.over_sampling import SMOTE
oversample = SMOTE()
X_sm, y_sm = oversample.fit_resample(X, y)
# Splitting Dataset into Train and Test (Smote)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_sm, y_sm,test_size=0.2,random_state=42)
这里我对我的数据应用了随机森林分类器
import math
from sklearn.metrics import accuracy_score, confusion_matrix
import seaborn as sn
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics
# RF = RandomForestClassifier(n_estimators=100)
# RF.fit(X_train, y_train.values.ravel())
# y_pred = RF.predict(X)
# print(metrics.classification_report(y,y_pred))
RF = RandomForestClassifier(n_estimators=10)
RF.fit(X_train, y_train.values.ravel())
如果我应用了这个,但是X也包含我们用于train的数据。如何删除我们已经用于训练数据的数据
y_pred = RF.predict(X)
print(metrics.classification_report(y,y_pred))
我过去使用过SMOTE,它不是最优的。近年来,研究人员已经证明了合成少数过样本技术(SMOTE)在生成分布上的一些缺陷。我知道有时候我们对不平衡类没有选择,但是你可以使用sklearn.ensemble.RandomForestClassifier
,在那里你可以定义一个适当的class_weight
来处理不平衡类问题。
检查scikit-learn
文档:
Scikit-documentation
我同意razimbres关于使用class_weight
的看法。另一个选择是先将数据集分成训练和测试。然后,把测试放在一边。只使用从这里开始的训练集:
X_sm, y_sm = oversample.fit_resample(X_train, y_train)
.
.
.