python - Sklearn ROC AUC 分数:ValueError:y 应该是一维数组,得到一个形状为 (15, 2) 的数组
问题描述
我有这个带有 target 的数据集LULUS
,它是一个不平衡的数据集。如果可以的话,我正在尝试为roc auc
我的数据的每一折打印分数,但在每一折中,它总是会引发错误说ValueError: y should be a 1d array, got an array of shape (15, 2) instead.
。我有点困惑我做错了哪一部分,因为我做的和文档中的完全一样。并且在几个方面,我知道如果只有一个标签,它不会打印分数,但它会返回关于一维数组的第二种类型的错误。
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
在电子表格中查看我的数据
解决方案
您的输出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])
推荐阅读
- mysql - Docker - PHP/MySQL - php_network_getaddresses:getaddrinfo 失败:名称或服务未知
- protractor - 如何通过量角器上传csv文件
- node.js - 如何使用 Elastic Search for Node.js 搜索属性?
- php - Laravel Dusk 管道测试中的 404
- python-3.x - PyInstaller 到 lunx 中的可执行文件,给出:运行 upx -v 时出错?
- javascript - 将对象数组转换为特定格式?
- python - 在 Django ORM 中获取相关模型计数的有效方法
- vue.js - 在我的 vue 项目中使用 websocket 时遇到问题
- javascript - 如何在 Angular 材料中以 datepicker 的格式显示正确的日期
- spring - CouchbaseException:使用计数器时的 INVALID_ARGUMENTS