python - sklearn所有型号都一样吗?
问题描述
我正在处理 fetch_kddcup99 数据集,并通过使用 pandas 将原始数据集转换为类似的东西,所有虚拟变量都是这样的:
请注意,删除重复项后,最终数据帧仅包含 149 个观察值。
然后我开始特征工程阶段,通过 OHE 协议类型,它是一个字符串分类变量并将 y 转换为 0,1。
X = pd_data.drop(target, axis=1)
y = pd_data[target]
y=y.astype('int')
protocol_type = [['tcp','udp','icmp']]
col_transformer = ColumnTransformer([
("encoder_tipo1", OneHotEncoder(categories=protocol_type, handle_unknown='ignore'),
['protocol_type']),
])
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=89)
最后我继续进行模型评估,结果如下:
models = []
models.append(('LR', LogisticRegression()))
models.append(('LDA', LinearDiscriminantAnalysis()))
models.append(('KNN', KNeighborsClassifier()))
models.append(('DTC', DecisionTreeClassifier()))
models.append(('NB', GaussianNB()))
models.append(('RFC', RandomForestClassifier()))
models.append(('SVM', SVC()))
#selector = SelectFromModel(estimator=model)
scaler = option2
selector = SelectKBest(score_func=f_classif,k = 3)
results=[]
for name, model in models:
pipeline = make_pipeline(col_transformer,scaler,selector)
#print(pipeline)
X_train_selected = pipeline.fit_transform(X_train,y_train)
#print(X_train_selected)
X_test_selected = pipeline.fit_transform(X_test,y_test)
modelo = model.fit(X_train_selected, y_train)
kf = KFold(n_splits=10, shuffle=True, random_state=89)
cv_results = cross_val_score(modelo,X_train_selected,y_train,cv=kf,scoring='accuracy')
results.append(cv_results)
print(name, cv_results)
plt.boxplot(results)
plt.show()
我的问题是为什么模型都是一样的?可能是由于数据帧的行数少,还是我做错了什么?
解决方案
你有 149 行,其中 80% 进入训练集,所以 119。然后你做 10 折交叉验证,所以每个测试折有大约 12 个样本。所以每个单独的测试折叠只有 13 个可能的准确度分数;即使分类器对某些样本的预测略有不同,它们也可能具有相同的准确度。(您看到的常见分数 (1, 0.88, 0.71) 与我期望的分数不相符,所以也许我错过了什么?)所以是的,可能这只是少数行,加上交叉验证。仅选择 3 个功能也可能有所帮助。
一件快速检查的事情是模型性能的一些连续得分,例如对数损失或 Brier 得分。
(而且,Gaussian
包含这么多二进制特征的数据可能是错误的朴素贝叶斯。)
推荐阅读
- reactjs - 如何使用 useState 更改嵌套对象的属性值?
- api - 每当我在颤动中运行我的程序时,我在控制台中收到此错误任何解决方案?
- gitlab - GitLab API 未列出容器注册表中的所有图像存储库
- android-studio - 如何在 Android Studio 4.1 中导出项目?
- python - HTTP 错误 404:未找到 尝试在浏览器中打开(网页抓取时)
- android - 为什么在第一个响应时调用 onResponse?
- reactjs - 使用带有 ReactTable 的查询参数
- powershell - 仅在 PowerShell 电子邮件中附加最近的文件
- gradle - 使用特定配置运行插件任务
- canvas - 将 THREE.CanvasTexture 与 WebGL 绘制的画布一起使用