Конкурсные вопросы
1. Предыстория конкурса
С быстрым развитием индустриализации и урбанизации экологические проблемы становятся все более заметными. Загрязнение воздуха является одной из важнейших экологических проблем в мире, влияющей на здоровье, производство и жизнь людей. Чтобы улучшить качество воздуха, моя страна активизировала усилия по мониторингу и защите окружающей среды, увеличила количество пунктов мониторинга качества воздуха, провела битву за защиту голубого неба и включила контроль качества воздуха и загрязнения в оценку работы департаментов. Научная и эффективная оценка качества воздуха может обеспечить научную основу для предотвращения и контроля загрязнения воздуха, что способствует осуществлению контроля загрязнения транспортными или экологическими отделами, снижает воздействие загрязнения воздуха и улучшает благосостояние людей. . Поскольку на атмосферную среду влияют источники загрязнения, метеорология и человеческий фактор, необходимо объективно и всесторонне оценивать качество воздуха.
2. Конкурсные задания
Ежедневная оценка качества атмосферного воздуха должна включать воздействие различных загрязнителей.Этот конкурс предоставляет ежедневные данные об АКИ и данные о концентрации основных загрязнителей.Участникам необходимо построить модель оценки качества воздуха и оценить относительное загрязнение между образцами в соответствии с предоставленными образцами.Степень.
3. Правила оценки
1. Описание данных
Игра предоставляет игрокам данные о загрязнении атмосферы, включая угарный газ, мелкие твердые частицы, твердые частицы, озон, двуокись азота, двуокись серы. Конкурс разделен на предварительные и полуфинальные этапы в два этапа, разница фаз между ними обеспечивается величиной выборки, а города выборки разные, остальные настройки одинаковые.
В частности, оценка качества воздуха сама по себе является проблемой неопределенности, и для построения моделей в основном используются методы неопределенности, такие как нечеткая математика, теория Грея, теория доказательств, нейронные сети и другие методы статистического анализа.
2. Метрики оценки
Эта модель использует среднеквадратичную ошибку (RMSE) для оценки модели на основе представленного файла результатов.
(1) Относительный комплексный коэффициент загрязнения IPRC образцов используется для оценки относительной степени загрязнения между образцами.
(2) На основе IPRC рассчитайте среднеквадратичное отклонение, где m — количество выборок, y — истинное значение IPRC, а y_pred — прогнозируемое значение IPRC.
3. Оценка и ранжирование
1.Данные загрузки предоставляются как для предварительного раунда, так и для полуфинала.Игроки могут отлаживать алгоритм локально и отправлять результаты на странице соревнования.
2. Каждая команда может представить максимум 3 раза в день.
3. Рейтинг сортируется в соответствии с количеством очков от высокого к низкому, и в рейтинговом списке будут выбраны исторические лучшие результаты команды для ранжирования.
4. Требования к представлению работ
1. Формат файла: отправьте в формате csv.
2. Размер файла: нет требований
3. Ограничение на количество заявок: максимум 3 заявки от команды в день.
4. Детали документа:
- Подается в формате csv, в кодировке UTF-8, первая строка — заголовок;
- Формат представления см. образец
5. Нет необходимости загружать другие файлы
Анализ конкурсных вопросов
Прежде всего, какую проблему решает эта игра? Из оценочного индекса RMSE мы можем сделать вывод, что эта конкуренция представляет собой проблему регрессии, которая заключается в прогнозировании значения IPRC, поэтому IPRC представляет собой значение y, которое является значением, которое мы хотим предсказать.
анализ данных
Набор данных предварительного конкурса — это данные о качестве воздуха в Баодине в 2016 году, а тестовый набор — это данные о качестве воздуха в International Village с 2016 по 2017 год. Оглядываясь назад на 2016 год, можно сказать, что загрязнение в Хэбэе в то время было все еще относительно серьезным: солнца часто не было видно, а хорошая погода была всего несколько дней в году. Сначала посмотрите на данные в первых 5 строках тренировочного набора:
Выполните код:
import numpy as np
import pandas as pd
import lightgbm as lgb
from sklearn.model_selection import KFold
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler, MinMaxScaler
train = pd.read_csv('data/train/train.csv')
print(train.head(5))
результат операции:
Дата | AQI | уровень качества | PM2.5 | PM10 | SO2 | CO | NO2 | O3_8h | IPRC |
---|---|---|---|---|---|---|---|---|---|
2016/1/1 | 293 | сильное загрязнение | 243 | 324 | 122 | 6.1 | 149 | 12 | 2.088378 |
2016/1/2 | 430 | сильно загрязнен | 395 | 517 | 138 | 7.5 | 180 | 18 | 3.316942 |
2016/1/3 | 332 | сильно загрязнен | 282 | 405 | 72 | 6.3 | 130 | 10 | 2.516425 |
2016/1/4 | 204 | сильное загрязнение | 154 | 237 | 73 | 3.5 | 72 | 34 | 1.505693 |
2016/1/5 | 169 | Умеренно загрязнен | 128 | 186 | 99 | 3.2 | 66 | 39 | 1.210233 |
Первая колонка - время.Для тех, кто испытал то время, время должно быть полезным.Для отопления на севере зимой качество воздуха намного хуже. Весной и осенью более ветреные времена, и, естественно, более хорошая погода.Летом иногда идут дожди, и качество воздуха может быть улучшено, когда идет дождь.Качество воздуха тесно связано с сезоном. Для обработки времени я использую три столбца для года, месяца и дня. код показывает, как показано ниже:
data["year"] = pd.to_datetime(data["日期"]).dt.year
data["month"] = pd.to_datetime(data["日期"]).dt.month
# 获取日
data["day"] = pd.to_datetime(data["日期"]).dt.day
Второй столбец AQI и PM2.5, PM10, SO2, CO, NO2, O3_8h, метод обработки этого столбца аналогичен, все используют MinMaxScaler(feature_range=(0, 1)), код выглядит следующим образом:
cols = ["PM2.5", "PM10", "SO2", "CO", "NO2", "O3_8h","day","month","year"]
scaler = MinMaxScaler(feature_range=(0, 1))
for clo in cols:
data[clo] = scaler.fit_transform(data[clo].values.reshape(-1, 1))
Третий столбец - это уровень качества, всего уровней 5. Это, несомненно, делается с помощью кодирования OneHot. Я использую метод, который поставляется с пандами для реализации кодирования OneHot. После завершения кодирования удалите столбцы уровня качества и даты. Код выглядит следующим образом:
df = pd.DataFrame({'质量等级': ['重度污染', '良', '中度污染', '轻度污染', '严重污染']})
ff = pd.get_dummies(data['质量等级'].values)
data['重度污染'] = ff['重度污染']
data['良'] = ff['良']
data['中度污染'] = ff['中度污染']
data['轻度污染'] = ff['轻度污染']
data['严重污染'] = ff['严重污染']
del data['质量等级']
del data['日期']
print(data)
результат операции:
Обработка данных метки Метка принимает MinMaxScaler(feature_range=(0, 1)), и метка масштабируется между 0-1, что удобно для прогнозирования. Код выглядит следующим образом:
scaler_y = MinMaxScaler(feature_range=(0, 1))
train['IPRC'] = scaler_y.fit_transform(train['IPRC'].values.reshape(-1, 1))
target = train['IPRC']
Полный код для анализа данных выглядит следующим образом:
import numpy as np
import pandas as pd
import lightgbm as lgb
from sklearn.model_selection import KFold
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler, MinMaxScaler
train = pd.read_csv('data/train/train.csv')
print(train.head(5))
test = pd.read_csv('data/test/test.csv')
smb = test['日期'].values
scaler_y = MinMaxScaler(feature_range=(0, 1))
train['IPRC'] = scaler_y.fit_transform(train['IPRC'].values.reshape(-1, 1))
target = train['IPRC']
del train['IPRC']
data = pd.concat([train, test], axis=0, ignore_index=True)
data = data.fillna(0)
data["year"] = pd.to_datetime(data["日期"]).dt.year
data["month"] = pd.to_datetime(data["日期"]).dt.month
# 获取日
data["day"] = pd.to_datetime(data["日期"]).dt.day
df = pd.DataFrame({'质量等级': ['重度污染', '良', '中度污染', '轻度污染', '严重污染']})
ff = pd.get_dummies(data['质量等级'].values)
data['重度污染'] = ff['重度污染']
data['良'] = ff['良']
data['中度污染'] = ff['中度污染']
data['轻度污染'] = ff['轻度污染']
data['严重污染'] = ff['严重污染']
del data['质量等级']
del data['日期']
print(data)
cols = ["PM2.5", "PM10", "SO2", "CO", "NO2", "O3_8h","day","month","year"]
scaler = MinMaxScaler(feature_range=(0, 1))
for clo in cols:
data[clo] = scaler.fit_transform(data[clo].values.reshape(-1, 1))
train = data[:train.shape[0]]
test = data[train.shape[0]:]
# print(X_train)
X_train = train.values
y_train = target.values
X_test = test.values
Построить модель
Модель выбирает lightgbm, lightgbm это бывший артефакт брашинга, и он очень популярен на различных соревнованиях по kaggle. Сегодня мы объясним, как реализовать алгоритм регрессии с помощью lightgbm.
Первым шагом является настройка параметров.
Общие параметры включают способность к обучению, регулярность l2, конечные узлы и т. д. В следующем коде перечислены общие конфигурации параметров:
param = {'num_leaves': 600,
'min_data_in_leaf': 30,
'objective': 'rmse',
'max_depth': -1,
'learning_rate': 0.001,
"min_child_samples": 30,
"boosting": "gbdt",
"feature_fraction": 0.9,
"bagging_freq": 1,
"bagging_fraction": 0.9,
"bagging_seed": 12,
"metric": 'mse',
"lambda_l2": 0.1,
'is_unbalance': True,
"verbosity": -1}
Чтобы предотвратить неравномерность данных, повысить точность модели и уменьшить переоснащение, мы используем 10-кратную перекрестную проверку. код показывает, как показано ниже:
# 五折交叉验证
folds = KFold(n_splits=10, shuffle=True, random_state=42)
oof = np.zeros(len(train))
predictions = np.zeros(len(test))
Затем начните обучение и тестирование, установите количество итераций на 100000, установите EarlyStop на 1000 и завершите итерацию, если потери не изменились после 1000 итераций, код выглядит следующим образом:
for fold_, (trn_idx, val_idx) in enumerate(folds.split(X_train, y_train)):
print("fold n°{}".format(fold_ + 1))
trn_data = lgb.Dataset(X_train[trn_idx], y_train[trn_idx])
val_data = lgb.Dataset(X_train[val_idx], y_train[val_idx])
num_round = 100000
clf = lgb.train(param,
trn_data,
num_round,
valid_sets=[trn_data, val_data],
verbose_eval=2000,
early_stopping_rounds=1000)
oof[val_idx] = clf.predict(X_train[val_idx], num_iteration=clf.best_iteration)
b = [round(i, 3) for i in oof]
predictions += clf.predict(X_test, num_iteration=clf.best_iteration) / folds.n_splits
сохранить результаты
Восстановите прогнозируемые результаты в соответствии с коэффициентом масштабирования, а затем сохраните результаты теста в CSV-файл.
inv_y = scaler_y.inverse_transform(predictions.reshape(1, -1))
inv_y = inv_y[0]
print(inv_y)
print("CV score: {:<8.5f}".format(mean_squared_error(oof, target)))
# 提交结果
resuktend = []
for (i1) in zip(inv_y):
resuktend.append(i1)
dataframe = pd.DataFrame({'date': smb, 'class': resuktend})
# 将DataFrame存储为csv,index表示是否显示行名,default=True
dataframe.to_csv("test_estimator.csv", index=False, sep=',')
Результаты теста следующие:
Тем не менее, оценка, представленная на конкурсной платформе, составляет всего около 0,2, а переобучение все еще очень серьезное.