Учитывая ваш вопрос: я не вижу никакой Lasso
регрессии в вашем коде. Попытка некоторых LassoCV
или ElasticNetCV(l1_ratio=[.1, .5, .7, .9, .95, .99, 1])
всегда является хорошим началом для поиска разумных значений альфа. Для Риджа RidgeCV
- это алгоритм CV. В отличие от LassoCV
и ElasticNetCV
, RidgeCV
использует LOO-CV , а принимает фиксированный набор альфа-значений, поэтому для оптимального вывода требуется больше пользовательской обработки. Возьмем для примера приведенный ниже пример кода:
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression, LassoCV, ElasticNetCV
from sklearn.linear_model import Ridge, RidgeCV
forest = pd.read_csv('forestfires.csv')
#Coulmn ve row feaute adlarimi duzenledim
forest.month.replace(('jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec'),(1,2,3,4,5,6,7,8,9,10,11,12), inplace=True)
forest.day.replace(('mon','tue','wed','thu','fri','sat','sun'),(1,2,3,4,5,6,7), inplace=True)
# iloc indeksin sırasıyla, loc indeksin kendisiyle işlem yapmaya olanak verir.Burada indeksledim
X = forest.iloc[:,0:12].values
y = forest.iloc[:,12].values
# 30 -70 olarak train test setlerimi ayirdim
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=3)
#x-y axis trainler arasina linear regressyon kurdum
lr = LinearRegression()
# The cross validation algorithms:
lasso_cv = LassoCV() # LassoCV will try to find the best alpha for you
# ElasticNetCV will try to find the best alpha for you, for a given set of combinations of Ridge and Alpha
enet_cv = ElasticNetCV()
ridge_cv = RidgeCV()
lr.fit(X_train, y_train)
lasso_cv.fit(X_train, y_train)
enet_cv.fit(X_train, y_train)
ridge_cv.fit(X_train, y_train)
#ridge regression modeli kurdum
rr = Ridge(alpha=0.01)
rr.fit(X_train, y_train)
rr100 = Ridge(alpha=100)
Теперь проверьте найденные альфа-значения с помощью:
print('LassoCV alpha:', lasso_cv.alpha_)
print('RidgeCV alpha:', ridge_cv.alpha_)
print('ElasticNetCV alpha:', enet_cv.alpha_, 'ElasticNetCV l1_ratio:', enet_cv.l1_ratio_)
ridge_alpha = ridge_cv.alpha_
enet_alpha, enet_l1ratio = enet_cv.alpha_, enet_cv.l1_ratio_
И центрируйте ваши новые RdigeCV
и / или ElasticNetCV
вокруг этих значений (l1_ratio
s <0
и >1
будут игнорироваться ElasticNetCV
):
enet_new_l1ratios = [enet_l1ratio * mult for mult in [.9, .95, 1, 1.05, 1.1]]
ridge_new_alphas = [ridge_alpha * mult for mult in [.9, .95, 1, 1.05, 1.1]]
# fit Enet and Ridge again:
enet_cv = ElasticNetCV(l1_ratio=enet_new_l1ratios)
ridge_cv = RidgeCV(alphas=ridge_new_alphas)
enet_cv.fit(X_train, y_train)
ridge_cv.fit(X_train, y_train)
Это должен быть первый шаг, чтобы найти хорошее альфа-значение и / или отношение l1 для ваших моделей. Конечно, другие шаги, такие как проектирование элементов и выбор правильной модели (например, Лассо: выполняет выбор элементов), должны предшествовать поиску хороших параметров. :)