Запуск алгоритмов для получения наиболее точных результатов

Эта статья - последняя из моей серии о наборе данных Housing. Для непосвященных, я уже рассказывал о EDA и Feature Engineering в предыдущих двух статьях.

Подводя итоги работы, мы рассмотрели ужасно рутинную работу по изменению данных в EDA и кропотливую переработку функций во второй статье. Мы изучили все переменные, решили, что оставить, а что отбросить, исходя из релевантности переменной по отношению к целевому значению. Наконец-то мы остановились на 64 тщательно отобранных функциях, чтобы обучить набор данных и спрогнозировать окончательные цены на жилье!

Для начала мы разделили набор данных на обучение и тестирование в соотношении 80:20.

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = .20, random_state = 42)

Затем мы используем Регрессор случайного леса для обучения набора данных вместе с CV случайного поиска для получения наилучших гиперпараметров.

rf = RandomForestRegressor(random_state = 42)
#Hyperparamater tuning using RanodomSearchCV

random_grid = { 
    'n_estimators': [int(x) for x in np.linspace(start = 200, stop = 2000, num = 10)],
    'max_features': ['auto', 'sqrt', 'log2'],
    'max_depth' : [6,7,8,9,10],
    'min_samples_split' : [2, 5, 10],
    'min_samples_leaf' : [1, 2, 4]
}
rf_random = RandomizedSearchCV(estimator = rf, param_distributions = random_grid, n_iter = 100, cv = 5, verbose=2, random_state=42, n_jobs = -1)

Наконец, мы помещаем модель в обучающую выборку и получаем максимально возможный результат.

rf_random.fit(X_train, y_train)
print(rf_random.best_params_)
print(rf_random.best_score_)

Лучшая оценка - 0,87. При выполнении поиска по сетке лучший результат незначительно увеличивается до 0,88.

#Hyperparameter tuning using GridSearchCV
param_grid = { 
    'n_estimators': [int(x) for x in np.linspace(start = 600, stop = 2000, num = 10)],
    'max_features': ['auto', 'sqrt', 'log2'],
    'max_depth' : [7,8,9,10],
    'min_samples_split' : [2, 5],
    'min_samples_leaf' : [1, 2]
}
grid_search = GridSearchCV(estimator = rf, param_grid = param_grid, 
                          cv = 3, n_jobs = -1, verbose = 2)
grid_search.fit(X_train, y_train)
print(grid_search.best_params_)
print(grid_search.best_score_)

Регрессия лассо вместе со случайным поиском дает гораздо меньший лучший результат - 0,85.

Регрессия XGBoost и CV случайного поиска дают более высокий балл - 0,9.

Однако лучший результат я получил с помощью Ridge Regression.

#Ridge Regressor
params_ridge ={
        'alpha':[0.25,0.5,1],
        'solver':['auto', 'svd', 'cholesky', 'lsqr', 'sparse_cg', 'sag', 'saga']
        }
ridge = Ridge()
ridge_random = RandomizedSearchCV(estimator = ridge, param_distributions = params_ridge,
                               n_iter=50, cv=5, n_jobs=-1,random_state=42, verbose=2)
ridge_random.fit(X_train, y_train)
print(ridge_random.best_params_)
print(ridge_random.best_score_)
ridge_grid = GridSearchCV(estimator = ridge, param_grid = params_ridge, cv = 5, n_jobs = -1, verbose = 2)
ridge_grid.fit(X_train, y_train)
print(ridge_grid.best_params_)
print(ridge_grid.best_score_)

И случайный поиск, и поиск по сетке дали мне лучший результат 0,92.

Следовательно, мы переходим к наилучшей оценке и прогнозируем на тестовой выборке.

model_ridge = ridge_random.best_estimator_
y_pred_ridge = np.exp(model_ridge.predict(X_test))
output_ridge = pd.DataFrame({'Id': test['Id'], 'SalePrice': y_pred_ridge})
output_ridge.to_csv('prediction_ridge.csv', index=False)

Это дало мне оценку 0,12460 на Kaggle!

Полный код см. По ссылке ниже: https://github.com/pritha21/Kaggle/blob/master/House_Prices.ipynb

Возможно, вам потребуется просмотреть его с помощью https://nbviewer.jupyter.org/.

Всегда приветствуются любые предложения, которые помогут мне улучшить свой результат!