RCV1 数据集上的 Bagging 分类器

问题描述

我必须在 RCV1 数据集上实现装袋分类器。我在 Google Colab 中使用 Python。

我按照文档 (https://scikit-learn.org/stable/datasets/real_world.html#rcv1-dataset) 中的说明分离了数据集:23149 个样本在我的训练集中,其余在我的测试集中。

我的目标是找出样本是否与特定类别匹配。为此,我只将目标的第一列作为我的标签向量。这是我用来分离数据集的代码

from sklearn.datasets import fetch_rcv1
rcv1 = fetch_rcv1()
y = rcv1.target.toarray()[:,0]

X_train = rcv1.data[0:23149]
X_test = rcv1.data[23149:]
y_train = y[0:23149]
y_test = y[23149:]

首先,我尝试在其上运行一个 DecisionTreeClassifier 并计算我的训练集和测试集的准确度、精确度、召回率和 f1 分数:

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score,confusion_matrix,precision_score,recall_score,f1_score

dt = DecisionTreeClassifier()
dt.fit(X_train,y_train)

y_predict = dt.predict(X_train)
print("Accuracy : ",accuracy_score(y_train,y_predict))
print(confusion_matrix(y_train,y_predict))
print("Precision : ",precision_score(y_train,y_predict))
print("Recall : ",recall_score(y_train,y_predict))
print("F1 score : ",f1_score(y_train,y_predict))

y_predict = dt.predict(X_test)
print("Accuracy : ",accuracy_score(y_test,y_predict))
print(confusion_matrix(y_test,precision_score(y_test,recall_score(y_test,y_predict)) 
print("F1 score : ",f1_score(y_test,y_predict))

我得到了这些结果:

Accuracy :  0.999049634973433
[[22475     0]
 [   22   652]]
Precision :  1.0
Recall :  0.9673590504451038
F1 score :  0.9834087481146305


Accuracy :  0.9536341702239317
[[739253  18361]
 [ 17863   5788]]
Precision :  0.23967866164230403
Recall :  0.24472538159063043
F1 score :  0.24217573221757324

据我了解,由于这个模型有很大的方差,所以使用 bagging 应该有助于减少它并找到更好的模型。

因此,我尝试使用 BaggingClassifier 并使用 gridsearchcv 找到最佳参数:

from sklearn.ensemble import BaggingClassifier
from sklearn.model_selection import gridsearchcv

baggingDT = BaggingClassifier(base_estimator = DecisionTreeClassifier())
param_grid = [
    {'n_estimators' : [2,5,10],'max_samples': [0.33,0.66,1.0]},]
grid_search = gridsearchcv(baggingDT,param_grid,cv=3,scoring='f1')
grid_search.fit(X_train,y_train)
print(grid_search.best_params_)

找到的最佳参数是 n_estimators = 5 和 max_samples = 0.66。所以我用我的新模型做了和以前一样的计算:

baggingDT = grid_search.best_estimator_
y_predict = baggingDT.predict(X_train)
print("Accuracy : ",y_predict))

y_predict = baggingDT.predict(X_test)
print("Accuracy : ",y_predict)) 

这是我得到的结果:

Accuracy :  0.9882500323988077
[[22453    22]
 [  250   424]]
Precision :  0.9506726457399103
Recall :  0.629080118694362
F1 score :  0.757142857142857


Accuracy :  0.9689810755633492
[[753648   3966]
 [ 20268   3383]]
Precision :  0.4603347394203293
Recall :  0.14303834932983805
F1 score :  0.21825806451612903

这些结果对我来说似乎并不令人满意,因为虽然精度提高了一点,但召回率下降了,并且发现的真阳性数量比以前少了。

我是否遗漏了某些东西,或者装袋分类器没有按预期工作是有原因的吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...