Пример, показывающий, как импортировать данные из файла CSV в Python и использовать подход машинного обучения библиотеки XGBoost для создания надежной модели и прогнозирования значений на будущее.
В этом примере мы будем использовать XGBoost, модуль машинного обучения на Python, который очень популярен и часто используется для задач регрессии и прогнозирования. Код здесь даст вам краткое введение в XGBoost, покажет, как обучить модель XGBoost, а затем предсказать значения на основе этой модели.
Набор данных
Мы будем использовать набор данных, который инкапсулирует выбросы углекислого газа, образующиеся при сжигании угля для производства электроэнергии в Соединенных Штатах Америки в период с 1973 по 2016 год. Используя XGBoost, мы попытаемся предсказать выбросы углекислого газа в ноутбуке jupyter на следующие несколько годы.
Что такое XGBoost на самом деле?
XGBoost - это оптимизированная распределенная библиотека повышения градиента, разработанная для быстрой и эффективной работы. XGBoost может помочь вам построить более мощную модель с использованием деревьев решений. XGBoost рассматривает листья текущего дерева решений и задается вопросом, принесет ли пользу модели превращение этого листа в новый оператор «если» с отдельными прогнозами. Выгода для модели зависит от выбранного оператора «если» и от того, на каком листе оно размещено - это можно определить с помощью градиента потерь. Единичные деревья решений могут быть неточными и могут страдать от высокой дисперсии, объединение результатов большого количества этих слабых учеников может фактически привести к сильному ученику, что приведет к лучшим предсказаниям и меньшей дисперсии.
Примечание. Установите библиотеку python - xgboost, используя команду pip install xgboost.
Импорт библиотек
Оператор импорта - это наиболее распространенный способ вызова библиотек в Python. В этом примере мы будем использовать библиотеки pandas, numpy, seaborn, matplotlib, sklearn и XGBoost.
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.model_selection import cross_val_score, KFold from sklearn.metrics import mean_squared_error from sklearn.metrics import mean_absolute_error from sklearn.metrics import r2_score import xgboost as xgb plt.style.use('seaborn-bright')
#Read the dataset and print the top 5 elements of the dataset data = pd.read_csv('CO2.csv') data.head(5)
Мы используем Pandas для импорта файла CSV. Мы замечаем, что фрейм данных содержит столбец «ГГГГММ», который необходимо разделить на столбцы «Год» и «Месяц». На этом этапе мы также удалим все нулевые значения, которые могут быть в фрейме данных. Наконец, мы извлечем последние пять элементов фрейма данных, чтобы проверить, работает ли наш код. Так оно и было!
data['Month'] = data.YYYYMM.astype(str).str[4:6].astype(float)
data['Year'] = data.YYYYMM.astype(str).str[0:4].astype(float)
data.drop(['YYYYMM'], axis=1, inplace=True)
data.replace([np.inf, -np.inf], np.nan, inplace=True)
data.tail(5)
На этом этапе мы быстро проверим, все ли значения столбцов имеют тип данных - float, и увидим форму фрейма данных.
# check for data type print(data.dtypes)
Value float64 Month float64 Year float64 dtype: object
# check the number of instances print(data.shape)
(523, 3)
Теперь мы разделим целевую переменную - «Значение» и остальные переменные, используя .iloc для подмножества данных. Затем набор данных необходимо преобразовать в оптимизированную структуру данных, называемую Dmatrix, которую поддерживает XGBoost.
y, X = data.loc[:,'Value'].values, data.loc[:,['Month', 'Year']].values
data_dmatrix = xgb.DMatrix(X,label=y)
Поезд-тестовый сплит
Прежде чем мы продолжим, мы должны создать набор поездов и тестов, используя функцию train_test_split из модуля sklearn model_selection с размером test_size, равным 20% данных. Кроме того, для обеспечения воспроизводимости результатов также назначается random_state.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=123)
XGBRegressor
Для этого конкретного фрейма данных мы будем использовать класс XGBRegressor пакета xgboost, который мы можем определить с его параметрами по умолчанию. Пожалуйста, не стесняйтесь добавлять новые параметры или изменять значения существующих, чтобы улучшить эти результаты.
reg_mod = xgb.XGBRegressor( n_estimators=1000, learning_rate=0.08, subsample=0.75, colsample_bytree=1, max_depth=7, gamma=0, ) reg_mod.fit(X_train, y_train)
XGBRegressor(base_score=0.5, booster='gbtree', colsample_bylevel=1, colsample_bynode=1, colsample_bytree=1, gamma=0, gpu_id=-1, importance_type='gain', interaction_constraints='', learning_rate=0.08, max_delta_step=0, max_depth=7, min_child_weight=1, missing=nan, monotone_constraints='()', n_estimators=1000, n_jobs=8, num_parallel_tree=1, random_state=0, reg_alpha=0, reg_lambda=1, scale_pos_weight=1, subsample=0.75, tree_method='exact', validate_parameters=1, verbosity=None)
Перекрестная проверка
После того, как мы обучили модель, давайте применим метод перекрестной проверки для оценки оценки обучения. Наша тренировочная оценка составляет 0,98, что довольно впечатляюще.
#After training the model, we'll check the model training score. scores = cross_val_score(reg_mod, X_train, y_train,cv=10) print("Mean cross-validation score: %.2f" % scores.mean())
Mean cross-validation score: 0.98
Затем мы можем предсказать тестовые данные, а затем проверить точность прогноза.
reg_mod.fit(X_train,y_train)
predictions = reg_mod.predict(X_test)
Здесь мы будем использовать общие показатели статистической точности, такие как RMSE - среднеквадратичная ошибка и R-квадратная оценка.
rmse = np.sqrt(mean_squared_error(y_test, predictions)) print("RMSE: %f" % (rmse))
RMSE: 4.948449
from sklearn.metrics import r2_score r2 = np.sqrt(r2_score(y_test, predictions)) print("R_Squared Score : %f" % (r2))
R_Squared Score : 0.987675
Как видите, эти статистические показатели восстановили нашу уверенность в этой модели. RMSE ~ 4,95 R-Squared Score ~ 98,8% Теперь давайте визуализируем исходный набор данных с помощью библиотеки seaborn.
plt.figure(figsize=(10, 5), dpi=80)
sns.lineplot(x='Year', y='Value', data=data)
График - исходный и прогнозный
Наконец, мы визуализируем исходные и прогнозируемые тестовые данные на графике, чтобы увидеть, как они совпадают друг с другом.
plt.figure(figsize=(10, 5), dpi=80)
x_ax = range(len(y_test))
plt.plot(x_ax, y_test, label="test")
plt.plot(x_ax, predictions, label="predicted")
plt.title("Carbon Dioxide Emissions - Test and Predicted data")
plt.legend()
plt.show()
Наконец, последний фрагмент кода напечатает прогнозируемые выбросы углекислого газа до 2025 года.
plt.figure(figsize=(10, 5), dpi=80)
df=pd.DataFrame(predictions, columns=['pred'])
df['date'] = pd.date_range(start='8/1/2016', periods=len(df), freq='M')
sns.lineplot(x='date', y='pred', data=df)
plt.title("Carbon Dioxide Emissions - Forecast")
plt.show()
Это пошаговое руководство для всех, кто начинает с XGBoost и хочет применить этот блестящий подход машинного обучения для решения задач классификации и регрессии.
Чтобы получить доступ к этому набору данных и Jupyter Notebook - перейдите на страницу GitHub.
Если вы хотите прочитать мои предыдущие статьи, ссылка здесь: -