Таким образом, если вы подходите к постоянной модели (т. Е. Все прогнозы приходят к 1 значению), это модель только для перехвата, где перехват является средним значением, потому что это объясняет наибольшую дисперсию.
Следовательно, исходя из формула, которую вы предоставили, R точно равен нулю. В тех случаях, когда предиктор или модель не имеют прогностического значения в нуле, он даст R ^ 2, близкий к нулю (или даже отрицательный).
Мы можем сделать этот расчет вручную ниже.
Первый набор данных:
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.metrics import r2_score
from sklearn import linear_model
iris = load_iris()
df = pd.DataFrame(data= iris['data'],
columns= iris['feature_names'] )
Мы подгоняем модель и рассчитываем остатки:
mdl_full = linear_model.LinearRegression()
mdl_full.fit(df[['petal width (cm)']],df['petal length (cm)'])
pred = mdl.predict(df[['petal width (cm)']])
resid_full = np.linalg.norm(df['petal length (cm)'] - pred) ** 2
Подгоняем модель только с перехватом:
mdl_constant = linear_model.LinearRegression()
mdl_constant.fit(X = np.repeat(0,150).reshape(-1, 1),y=df['petal length (cm)'])
pred = mdl_constant.predict(df[['petal width (cm)']])
resid_constant = np.linalg.norm(df['petal length (cm)'] - pred) ** 2
Мы можем вычислить r ^ 2 вручную:
(1 - resid_full / resid_constant)
0.9265562307373204
И это именно то, что вы получаете из .score:
mdl_full.score(df[['petal width (cm)']],df['petal length (cm)'])
0.9265562307373204
Таким образом, вы можете увидеть, если полная модель точно такая же как ваша постоянная модель, она дает квадрат r, равный 0. Вы можете перефразировать постоянную модель с X = 1, X = 2 и т. д. c, но это дает по существу тот же результат.