Оценка AUC Sklearn ROC : Ошибка значения: y должен быть массивом 1d, вместо этого получен массив формы (15, 2)

#python #scikit-learn

Вопрос:

У меня есть этот набор данных с целью LULUS , это набор данных о дисбалансе. Я пытаюсь напечатать roc auc оценку, если бы мог, для каждого сгиба моих данных, но в каждом сгибе почему-то всегда говорится об ошибке ValueError: y should be a 1d array, got an array of shape (15, 2) instead. . Я немного запутался, какую часть я сделал неправильно, потому что я делаю это точно так же, как в документации. И в несколько раз я понимаю, что он не будет печатать оценку, если есть только одна метка, но тогда он вернет ошибку второго типа о массиве 1d.

 merged_df = pd.read_csv(r'C:...merged.csv')

num_columns = merged_df.select_dtypes(include=['float64']).columns
cat_columns = merged_df.select_dtypes(include=['object']).drop(['TARGET','NAMA'], axis=1).columns

numeric_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='mean')),
    ('scaler', StandardScaler())])

categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent')),
    ('label', OneHotEncoder(handle_unknown='ignore'))])

preprocessor = ColumnTransformer(
    transformers=[
        ('num', numeric_transformer, num_columns),
        ('cat', categorical_transformer, cat_columns)])

X = merged_df.drop(['TARGET','Unnamed: 0'],1)
y = merged_df['TARGET']

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2)

X_train = X_train.drop(['NIM', 'NAMA'],1)
X_test = X_test.drop(['NIM', 'NAMA'],1)

rf = Pipeline(steps=[('preprocessor', preprocessor),
                     ('classifier',tree.DecisionTreeClassifier(class_weight='balanced', criterion='entropy'))])

rf.fit(X_train, y_train)

pred = rf.predict(X_test)

y_proba = rf.predict_proba(X_test)

from sklearn.model_selection import KFold

kf = KFold(n_splits=10)

for train, test in kf.split(X):
    X_train, X_test = X.loc[train], X.loc[test]
    y_train, y_test = y.loc[train], y.loc[test]
    model = rf.fit(X_train, y_train)
    y_proba = model.predict_proba(X_test)
    try:
        print(roc_auc_score(y_test, y_proba,average='weighted', multi_class='ovr'))
    except ValueError:
        pass
 

Смотрите мои данные в электронной таблице

Ответ №1:

Ваш вывод model.predict_proba() — это матрица с 2 столбцами, по одному для каждого класса. Чтобы рассчитать roc, вам нужно указать вероятность положительного класса:

Использование примера набора данных:

 from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score
from sklearn.model_selection import train_test_split

X, y = make_classification(n_classes=2)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.33, random_state=42)
rf = RandomForestClassifier()
model = rf.fit(X_train, y_train)
y_proba = model.predict_proba(X_test)
 

Это выглядит так:

 array([[0.69, 0.31],
       [0.13, 0.87],
       [0.94, 0.06],
       [0.94, 0.06],
       [0.07, 0.93]])
 

Тогда сделай:

 roc_auc_score(y_test, y_proba[:,1])
 

Комментарии:

1. ах, я понимаю, но я когда-либо пытался рассчитать оценку auc roc с помощью набора данных Iris и просто использовать roc_auc_score(y_test, y_proba) , но это все еще работает.. это почему? извините, я не знаком со счетом roc auc..