Целевая трансформация в RFECV scikit-learn - PullRequest
1 голос
/ 29 сентября 2019

Я использую RFECV для выбора функций в scikit-learn.Я хотел бы сравнить результат простой линейной модели (X,y) с результатом преобразованной логарифмической модели (используя X, log(y))

Простая модель : RFECV и cross_val_score дают тот же результат (нам нужно сравнить средний балл перекрестной проверки по всем сгибам со баллом RFECV для всех функций: 0.66 = 0.66, нет проблем, результаты надежны)

Модель журнала : проблема : кажется, что RFECV не обеспечивает способ передачи y.баллы в этом случае 0.55 против 0.53.Это вполне ожидаемо, потому что мне пришлось вручную применить np.log, чтобы соответствовать данным: log_seletor = log_selector.fit(X,np.log(y)).Я думаю, что этот показатель r2 для y = log(y), без inverse_func, в то время как нам нужен способ подгонки модели к log(y_train) и вычисления баллов с использованием exp(y_test).Кроме того, если я пытаюсь использовать TransformedTargetRegressor, я получаю сообщение об ошибке, показанное в коде: Классификатор не раскрывает атрибуты "coef_" или "feature_importances_"

Как решитьпроблема и убедитесь, что процесс выбора функции является надежным?

from sklearn.datasets import make_friedman1
from sklearn.feature_selection import RFECV
from sklearn import linear_model
from sklearn.model_selection import cross_val_score
from sklearn.compose import TransformedTargetRegressor
import numpy as np

X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
estimator = linear_model.LinearRegression()
log_estimator = TransformedTargetRegressor(regressor=linear_model.LinearRegression(),
                                                func=np.log,
                                                inverse_func=np.exp)
selector = RFECV(estimator, step=1, cv=5, scoring='r2')
selector = selector.fit(X, y)
###
# log_selector = RFECV(log_estimator, step=1, cv=5, scoring='r2')
# log_seletor = log_selector.fit(X,y) 
# #RuntimeError: The classifier does not expose "coef_" or "feature_importances_" attributes
###
log_selector = RFECV(estimator, step=1, cv=5, scoring='r2')
log_seletor = log_selector.fit(X,np.log(y))

print("**Simple Model**")
print("RFECV, r2 scores: ", np.round(selector.grid_scores_,2))
scores = cross_val_score(estimator, X, y, cv=5)
print("cross_val, mean r2 score: ", round(np.mean(scores),2), ", same as RFECV score with all features") 
print("no of feat: ", selector.n_features_ )

print("**Log Model**")
log_scores = cross_val_score(log_estimator, X, y, cv=5)
print("RFECV, r2 scores: ", np.round(log_selector.grid_scores_,2))
print("cross_val, mean r2 score: ", round(np.mean(log_scores),2)) 
print("no of feat: ", log_selector.n_features_ )

Выход:

**Simple Model**
RFECV, r2 scores:  [0.45 0.6  0.63 0.68 0.68 0.69 0.68 0.67 0.66 0.66]
cross_val, mean r2 score:  0.66 , same as RFECV score with all features
no of feat:  6

**Log Model**
RFECV, r2 scores:  [0.39 0.5  0.59 0.56 0.55 0.54 0.53 0.53 0.53 0.53]
cross_val, mean r2 score:  0.55
no of feat:  3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...