使用交叉验证分数获得零分

Posted

技术标签:

【中文标题】使用交叉验证分数获得零分【英文标题】:Getting a score of zero using cross val score 【发布时间】:2018-11-09 09:13:03 【问题描述】:

我正在尝试在我的数据集上使用 cross_val_score,但分数一直为零:

这是我的代码:

df = pd.read_csv("Flaveria.csv")
df = pd.get_dummies(df, columns=["N level", "species"], drop_first=True)

# Extracting the target value from the dataset
X = df.iloc[:, df.columns != "Plant Weight(g)"]
y = np.array(df.iloc[:, 0], dtype="S6")

logreg = LogisticRegression()
loo = LeaveOneOut()

scores = cross_val_score(logreg, X, y, cv=loo)
print(scores)

特征是分类值,而目标值是浮点值。我不完全确定为什么我只得到零。

创建虚拟变量之前的数据如下所示

N level,species,Plant Weight(g)
L,brownii,0.3008
L,brownii,0.3288
M,brownii,0.3304
M,brownii,0.388
M,brownii,0.406
H,brownii,0.3955
H,brownii,0.3797
H,brownii,0.2962

更新了我仍然得到零的代码:

 from sklearn.model_selection import LeaveOneOut
from sklearn.model_selection import cross_val_score

from sklearn.ensemble import RandomForestRegressor


import numpy as np
import pandas as pd

# Creating dummies for the non numerical features in the dataset

df = pd.read_csv("Flaveria.csv")
df = pd.get_dummies(df, columns=["N level", "species"], drop_first=True)

# Extracting the target value from the dataset
X = df.iloc[:, df.columns != "Plant Weight(g)"]
y = df.iloc[:, 0]

forest = RandomForestRegressor()
loo = LeaveOneOut()

scores = cross_val_score(forest, X, y, cv=loo)
print(scores)

【问题讨论】:

LogisticRegression 是一个分类器。对于浮点(连续)值,请尝试回归。查看以 Regressor 结尾的 scikit 估计器。 我将 LogisticRegression 更改为 RandomForestRegressor,但我仍然得到零? 请提供一小部分数据集来演示此问题。 请分享数据 已在数据中编辑 【参考方案1】:

一般cross_val_score 会将数据拆分为训练并使用给定的迭代器进行测试,然后使用训练数据拟合模型并在测试折叠上得分。对于回归,r2_score 是 scikit 中的默认值。

您已将 LeaveOneOut() 指定为您的 cv 迭代器。所以每个折叠都将包含一个测试用例。在这种情况下,R_squared 将始终为 0。

看着formula for R2 in wikipedia:

R2 = 1 - (SS_res/SS_tot)

还有

SS_tot = sqr(sum(y - y_mean))

这里对于单个情况,y_mean 将等于 y 值,因此分母为 0。所以整个 R2 是未定义的 (Nan)。在这种情况下,scikit-learn 会将值设置为 0,而不是 nan

将 LeaveOneOut() 更改为任何其他 CV 迭代器,如 KFold,将给您一些非零结果,正如您已经观察到的那样。

【讨论】:

以上是关于使用交叉验证分数获得零分的主要内容,如果未能解决你的问题,请参考以下文章

是否有可能为许多分类模型获得相同的交叉验证分数

k折交叉验证模型选择方法

在 Scikit-Learn 中获得线性回归的大交叉验证分数

线性回归中的交叉验证

加快 SVM 评分中的交叉验证

应该对原始数据还是拆分数据执行交叉验证分数?