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

我在尝试对数据集使用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 datasetX = 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.3008L,brownii,0.3288M,brownii,0.3304M,brownii,0.388M,brownii,0.406H,brownii,0.3955H,brownii,0.3797H,brownii,0.2962

更新后的代码,我仍然得到零分:

 from sklearn.model_selection import LeaveOneOutfrom sklearn.model_selection import cross_val_scorefrom sklearn.ensemble import RandomForestRegressorimport numpy as npimport pandas as pd# Creating dummies for the non numerical features in the datasetdf = pd.read_csv("Flaveria.csv")df = pd.get_dummies(df, columns=["N level", "species"], drop_first=True)# Extracting the target value from the datasetX = 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)

回答:

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

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

查看维基百科中R2的公式

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,会像你已经观察到的那样,给你一些非零的结果。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注