【问题标题】:Train multiple classifiers and compare metrics训练多个分类器并比较指标
【发布时间】:2021-02-04 03:01:50
【问题描述】:

我想一次计算不同的分类器并将结果传输到 Pandas 数据框。

# Lets create some test data
import pandas as pd
import numpy as np
import string 
import random
integers = pd.DataFrame(np.random.randint(0,100,size=(50, 1)), columns=list('I'))
strings = pd.DataFrame([random.choice('ab') for _ in range(50)], columns=list('S'))
df2 = pd.concat([strings,integers], axis=1)
df2.head()
    S   I
0   a   5
1   a   31
2   b   84
3   a   79
4   b   92


# Train - Test
from sklearn.model_selection import train_test_split

X = df2[["I"]].values
y = df2["S"]
X_train, X_test, y_train, y_test = train_test_split(X, y)

#Load libraries
from sklearn import metrics
from sklearn.model_selection import cross_val_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
from sklearn.linear_model import LogisticRegression


#Classifiers 
classifiers = [
KNeighborsClassifier(30),
DecisionTreeClassifier(),
RandomForestClassifier(),
AdaBoostClassifier(),
LogisticRegression()]


n_range = list(range(1, 10))
RandomForestClf = []
data_frame = []

for n in n_range:
#    name = clf.__class__.__name__
model = RandomForestClassifier(n_estimators=n)
scores = cross_val_score(model, X, y, cv=5, scoring="accuracy")
RandomForestClf.append(scores.mean())
data_frame = pd.DataFrame({"Random Forest": RandomForestClf})

我无法让各种分类器通过 for 循环。

如何设置 for 循环,以便运行每个分类器,然后将预测转移到 panda 数据帧?

我当前的 for 循环只有在代码中提到模型时才有效。

我是 Python 新手。

感谢您的帮助!

【问题讨论】:

    标签: python pandas for-loop machine-learning


    【解决方案1】:

    您可以在 for 循环之外定义数据框,然后分配给它查找分类器名称,检查对象的 type

    from sklearn import metrics
    from sklearn.model_selection import cross_val_score
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
    from sklearn.linear_model import LogisticRegression
    
    
    #Classifiers 
    classifiers = [KNeighborsClassifier(30),
                    DecisionTreeClassifier(),
                    RandomForestClassifier(),
                    AdaBoostClassifier(),
                    LogisticRegression()]
    
    from sklearn.datasets import load_iris
    X, y = load_iris(return_X_y=True)
    X_train, X_test, y_train, y_test = train_test_split(X, y)
    
    k = 5
    preds = pd.DataFrame(index=[*range(k)])
    
    for cls in classifiers:
        scores = cross_val_score(cls, X, y, cv=k, scoring="accuracy")
        preds[type(cls).__name__] = scores
    

    在这种情况下,你会得到:

    print(preds)
       KNeighborsClassifier  DecisionTreeClassifier  RandomForestClassifier  \
    0              0.900000                0.966667                0.966667   
    1              0.966667                0.966667                0.966667   
    2              0.933333                0.900000                0.933333   
    3              0.900000                0.966667                0.966667   
    4              1.000000                1.000000                1.000000   
    
       AdaBoostClassifier  LogisticRegression  
    0            0.966667            0.966667  
    1            0.933333            1.000000  
    2            0.900000            0.933333  
    3            0.933333            0.966667  
    4            1.000000            1.000000   
    

    这是一个related answer,它从分类器列表中绘制多个混淆矩阵,以防您也发现它也很有用。

    【讨论】:

    • 非常感谢您的解决方案!不幸的是,这段代码只在循环中迭代一次。我想有几个分数,这样我就可以显示 n_estimators 的历史记录。 n_range = list(range(1, 10))
    • 您是指交叉验证中的所有分数? @Skruff
    • 是的,完全正确!所以我可以用估计器的过程绘制一个图表。 @yatu
    • Updsted - 如果我理解正确,请告诉我@Skruff
    • 这正是我想要的!非常感谢! @yatu 很棒的社区
    猜你喜欢
    • 2019-05-20
    • 2013-04-20
    • 2013-04-11
    • 2017-08-10
    • 2018-04-19
    • 2021-01-26
    • 1970-01-01
    • 2019-10-21
    • 2020-10-19
    相关资源
    最近更新 更多