在 RandomForest

如何解决在 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%。什么会导致这种情况?或者可以吗?

enter image description here

这是我使用的代码,类似于我在链接中提供的代码。转到页面底部。

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%

enter image description here

通过@AlexSerraMarrugat 建议的混淆矩阵检查

编辑

enter image description here

测试: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

enter image description here

编辑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))

enter image description here

解决方法

首先,正如 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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-