使用交叉验证分数获得零分
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,将给您一些非零结果,正如您已经观察到的那样。
【讨论】:
以上是关于使用交叉验证分数获得零分的主要内容,如果未能解决你的问题,请参考以下文章