如何解决在 RandomForest
我有不平衡的数据集,我应用 RandomOverSampler
来获得平衡的数据集。
oversample = RandomOverSampler(sampling_strategy='minority')
X_over,y_over = oversample.fit_resample(X,y)
之后我关注了这个 kaggle post RandomForest implementation for feature selection
https://www.kaggle.com/gunesevitan/titanic-advanced-feature-engineering-tutorial(转到页面底部,您将看到类似的实现。)
我有一个类似泰坦尼克号的真实数据集:) 并试图从中获取特征重要性!
我遇到的问题是,尽管分类器的准确度非常高~0.99%,但我得到的特征重要性约为~0.1%。什么会导致这种情况?或者可以吗?
这是我使用的代码,类似于我在链接中提供的代码。转到页面底部。
classifiers = [RandomForestClassifier(random_state=SEED,criterion='gini',n_estimators=20,bootstrap=True,max_depth=5,n_jobs=-1)]
#DecisionTreeClassifier(),#LogisticRegression(),#KNeighborsClassifier()]
#GradientBoostingClassifier(),#SVC(probability=True),GaussianNB()]
log_cols = ["Classifier","Accuracy"]
log = pd.DataFrame(columns=log_cols)
SEED = 42
N = 15
skf = StratifiedKFold(n_splits=N,random_state=None,shuffle=True)
importances = pd.DataFrame(np.zeros((X.shape[1],N)),columns=['Fold_{}'.format(i) for i in range(1,N + 1)],index=data.columns)
acc_dict = {}
for fold,(train_index,test_index) in enumerate(skf.split(X_over,y_over)):
X_train,X_test = X_over[train_index],X_over[test_index]
y_train,y_test = y_over[train_index],y_over[test_index]
for clf in classifiers:
#pipe1=make_pipeline(sampling,clf)
print(clf)
name = clf.__class__.__name__
clf.fit(X_train,y_train)
train_predictions = clf.predict(X_test)
acc = accuracy_score(y_test,train_predictions)
if 'Random' in name:
importances.iloc[:,fold - 1] = clf.feature_importances_
if name in acc_dict:
acc_dict[name] += acc
else:
acc_dict[name] = acc
#doing grid search for best input parameters for RF
#CV_rfc = GridSearchCV(estimator=clf,param_grid=param_grid,cv= 5)
#CV_rfc.fit(X_train,y_train)
for clf in acc_dict:
acc_dict[clf] = acc_dict[clf] / 10.0
log_entry = pd.DataFrame([[clf,acc_dict[clf]]],columns=log_cols)
log = log.append(log_entry)
我得到的特征重要性值几乎相同,最好是 ~0.1%
通过@AlexSerraMarrugat 建议的混淆矩阵检查
编辑
测试:0.9926166568222091 火车:0.9999704661911724
编辑2
之后尝试了 randomoversplit:
from imblearn.over_sampling import RandomOverSampler
oversample = RandomOverSampler(sampling_strategy='minority')
x_over,y_over = oversample.fit_resample(X_train,Y_train)
# summarize class distribution
print(Counter(y_over))
print(len(x_over))
#创建混淆矩阵
from sklearn.metrics import plot_confusion_matrix
clf = RandomForestClassifier(random_state=0) #Here change the hyperparameters
clf.fit(x_over,y_over)
predict_y=clf.predict(x_test)
plot_confusion_matrix(clf,x_test,y_test,cmap=plt.cm.Blues)
print("Test: ",clf.score(x_test,y_test))
print("Train: ",clf.score(x_over,y_over))
测试:0.9926757235676315 火车:1.0
编辑3 训练数据的混淆矩阵
from sklearn.metrics import plot_confusion_matrix
plot_confusion_matrix(clf,X_train,Y_train,cmap=plt.cm.Blues)
print("Train: ",clf.score(X_train,Y_train))
解决方法
首先,正如 Gaussian Prior 所说,您必须仅对您的训练数据集进行过采样。然后,在您训练好模型后,使用您的数据集测试准确性。
如果我理解你的话,你的测试数据现在有 0.1% 的准确率。请检查您是否过度拟合(如果准确度训练数据集远大于准确度测试数据,则表明可能存在过度拟合)。尝试更改一些超参数。使用此代码:
clf = RandomForestClassifier(random_state=0) #Here change the hyperparameters
clf.fit(X_train,y_train)
predict_y=clf.predict(X_test)
plot_confusion_matrix(clf,X_test,y_test,cmap=plt.cm.Blues)
print("Test: ",clf.score(X_test,y_test))
print("Train: ",clf.score(X_train,y_train))
关于特征重要性。我怀疑您的结果是正确的。他们说你有 5 个对你的模型最重要的特征。在我看来,您拥有最好的输出之一,其中包含一些重要功能。
如果只有一个唯一的重要特征,你只会得到一个大值(模型只从一个特征中获取信息,这根本不好)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。