Запуск алгоритмов для получения наиболее точных результатов
Эта статья - последняя из моей серии о наборе данных 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/.
Всегда приветствуются любые предложения, которые помогут мне улучшить свой результат!