Получение нулевой оценки с использованием кросс-балльной оценки - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь использовать 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)

1 Ответ

0 голосов
/ 30 мая 2018

Общее 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, даст вам ненулевые результаты, как у васуже наблюдалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...