首页 > 解决方案 > 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()

来自 CV 的箱线图

我的问题是为什么模型都是一样的?可能是由于数据帧的行数少,还是我做错了什么?

标签: pythonmachine-learningscikit-learnmodel

解决方案


你有 149 行,其中 80% 进入训练集,所以 119。然后你做 10 折交叉验证,所以每个测试折有大约 12 个样本。所以每个单独的测试折叠只有 13 个可能的准确度分数;即使分类器对某些样本的预测略有不同,它们也可能具有相同的准确度。(您看到的常见分数 (1, 0.88, 0.71) 与我期望的分数不相符,所以也许我错过了什么?)所以是的,可能这只是少数行,加上交叉验证。仅选择 3 个功能也可能有所帮助。

一件快速检查的事情是模型性能的一些连续得分,例如对数损失或 Brier 得分。

(而且,Gaussian包含这么多二进制特征的数据可能是错误的朴素贝叶斯。)


推荐阅读