Прогнозировать рабочее состояние водоразборной точки
Введение
Наличие чистой питьевой воды является важной проблемой общественного здравоохранения в менее развитых частях мира, включая многие части Африки и Азии.
На самом деле, инфраструктура доставки воды в некоторых странах по-прежнему в основном состоит из ручных и насосов с гравитационным питанием.
Хотя такие насосы жизненно необходимы для жизнеобеспечения многих городов и деревень, они, как и любые механические устройства, требуют постоянного управления и периодического обслуживания для обеспечения их надлежащего функционирования и сведения к минимуму риск загрязнения колодца непитьевой водой.
Одной из стран, которая в значительной степени зависит от таких насосов, является восточноафриканская страна Танзания.
По данным Министерства водного хозяйства Танзании, по всей стране можно найти более 74 000 таких насосов. Хотя установка этих насосов в значительной степени финансируется за счет пожертвований благотворительных и других неправительственных организаций (НПО), их текущее обслуживание, как правило, является обязанностью местного сообщества, в котором они проживают.
К сожалению, затраты на техническое обслуживание насосов часто не по карману местному сообществу, в результате чего насосы выходят из строя. Кроме того, местные жители часто не подозревают о необходимости проведения необходимого технического обслуживания из-за очевидного отсутствия каких-либо серьезных проблем с накачкой до тех пор, пока она в конечном счете не выйдет из строя.
Описание проблемы -
Можем ли мы предсказать, какие водяные насосы неисправны?
Используя данные Taarifa и Министерства водного хозяйства Танзании, можем ли мы предсказать, какие насосы исправны, какие требуют ремонта и какие совсем не работают?
Предсказать один из этих трех классов на основе ряда переменных, включая описание типа насоса, дату установки насоса, физическое расположение насоса, качество подаваемой воды. насосом и описанием управления насосом.
Преимущества правильного предсказания -
Почему предсказание состояния помпы поможет?
Разумное понимание того, какие точки водоснабжения выйдут из строя, может улучшить техническое обслуживание и обеспечить доступность чистой питьевой воды для населения по всей Танзании.
Источник данных
Данные для этого проекта были получены с веб-сайта DrivenData.org, на котором размещена задача данных. В частности, мы использовали наборы данных, доступные по следующей веб-ссылке:
Набор данных состоит из атрибутов, описывающих в общей сложности 59 400 танзанийских водяных насосов. Каждый водяной насос представлен в общей сложности 39 качественными и количественными атрибутами.
Вот пошаговый процесс решения проблемы:
1. Исследовательский анализ данных:
Сводка данных:
Чтение набора данных -
df_train = pd.read_csv('Training Set.csv') df_train.shape (59400, 40)
Для каждого 59400 водяных насосов нам предоставили 39 атрибутов (за исключением уникального идентификатора записи), которые потенциально можно было использовать в качестве переменных-предикторов.
df_labels = pd.read_csv('Training Set Labels.csv') df_labels.value_counts('status_group') status_group functional 32259 non functional 22824 functional needs repair 4317 dtype: int64
Набор данных Labels содержит статус каждого наблюдения насоса в наборе обучающих данных.
sns.countplot(df_labels['status_group'])
График показывает, что 54,3 % всех насосов в наборе данных оказались исправными, в то время как 38,4 % не работали, а 7,3 % не работали. состояние функциональное требует ремонта.
Кроме того, мы сталкиваемся с проблемой несбалансированного набора данных.
Основные выводы из приведенного выше сюжета:
- Когда мы анализируем значение каждой переменной, мы можем определить, является ли процент насосов, относящихся к этому значению переменной, превышаетили не дотягивает до уровня общие показатели эффективности на графике выше.
- Например, те, у кого "функциональный" показатель превышает 54,3 %, могут иметь общие характеристики, воспроизведение которых может принести пользу менее производительным насосам.
- Выбор показателя эффективности будет иметь решающее значение из-за несбалансированного характера данных, поскольку «Точность» может ввести нас в заблуждение.
Особенности в наборе данных:
df_train.columns Index(['id', 'amount_tsh', 'date_recorded', 'funder', 'gps_height', 'installer', 'longitude', 'latitude', 'wpt_name', 'num_private', 'basin', 'subvillage', 'region', 'region_code', 'district_code', 'lga','ward', 'population', 'public_meeting', 'recorded_by', 'scheme_management', 'scheme_name', 'permit', 'construction_year', 'extraction_type', 'extraction_type_group', 'extraction_type_class', 'management', 'management_group', 'payment', 'payment_type', 'water_quality', 'quality_group', 'quantity', 'quantity_group', 'source', 'source_type', 'source_class', 'waterpoint_type', 'waterpoint_type_group'],dtype='object')
Каждая независимая переменная может быть охарактеризована как принадлежащая к одному из трех классов:
- Некатегориальные числовые переменные
- Категориальные переменные
- Административные переменные
Переменные, классифицированные как «Административные» по своей природе, по-видимому, служат исключительно атрибутами управления данными в наборе данных:
- id – уникальный идентификатор для каждой записи данных.
- date_recorded — дата сбора данных исследовательской компанией.
- recorded_by — название компании, занимающейся сбором данных/исследованиями.
Объединение меток и функций обучения
df_final = pd.merge(df_train, df_labels, on='id')
Анализ отсутствующих значений данных
numerical_variables=['amount_tsh','gps_height','population','longitude','latitude','num_private','construction_year'] for x in numerical_variables: count = (df_train[x] == 0).sum() print(f'Count of zeros in {x} : ', count) Count of zeros in amount_tsh : 41639 Count of zeros in gps_height : 20438 Count of zeros in population : 21381 Count of zeros in longitude : 1812 Count of zeros in latitude : 0 Count of zeros in num_private : 58643 Count of zeros in construction_year : 20709
Наш анализ показал, что каждая некатегориальная числовая переменная содержит значительное количество недопустимых значений данных, представленных нулями.
Мы создали пользовательскую функцию под названием «missing_values_table», чтобы увидеть, имеет ли какая-либо категориальная переменная какие-либо значения NaN
.
missing_values_table(df_train)
There are 7 columns that have missing values.
У семи категориальных переменных были обнаружены отсутствующие значения данных, на что указывают значения NAN.
Найдены ключевые данные:
- Отсутствующие значения данных обнаружены в 31 587 из 59 400 записей в наборе данных (53,17%).
- 3655 отсутствующих значений спонсора и установщика совпадают друг с другом.
- Насос с полным статическим напором, равным нулю, не был бы особенно полезен, поскольку он не был бы способен производить воду из источника, расположенного ниже его выходной точки.
Широкое распространение отсутствующих данных во всем наборе данных было убедительным показателем необходимости разработки статистически достоверных алгоритмов вменения данных для многих затронутых переменных.
Понимание, полученное с помощью агрегации данных
Один из таких примеров из агрегации данных показан ниже:
df_train.groupby(["payment_type",'payment'])["payment_type"].count() payment_type payment annually pay annually 3642 monthly pay monthly 8300 never pay never pay 25348 on failure pay when scheme fails 3914 other other 1054 per bucket pay per bucket 8985 unknown unknown 8157 Name: payment_type, dtype: int64
Несколько переменных, содержащихся в наборе данных, являются либо дублирующими, либо составными из других переменных:
- Extraction_type_group — это бинированная/составная версия extract_type.
- payment_type на 100% дублирует платеж
- quality_group — это объединенная/составная версия water_quality.
- quantity_group на 100% дублирует количество
- source_type — это сборная/составная версия исходного кода.
- waterpoint_type_group — это объединенная/составная версия waterpoint_type.
Одно из действий, которые необходимо предпринять при обработке данных с использованием приведенной выше информации:
Мы можем отказаться от некоторых из этих переменных, поскольку они не добавляют никакой дополнительной ценности, кроме дублирования данных.
Визуализация данных с использованием TSNE
Предварительно нормализуйте числовые признаки.
from sklearn.preprocessing import normalize from sklearn import preprocessing x=df_train[['amount_tsh','gps_height','num_private','population','longitude','latitude']] x1 = x.values #returns a numpy array min_max_scaler = preprocessing.MinMaxScaler() x_scaled = min_max_scaler.fit_transform(x1)
Выполнить ТСНЭ
from sklearn.manifold import TSNE import seaborn as sns tsne = TSNE(n_components=2,perplexity=10, verbose=1, random_state=123) z = tsne.fit_transform(X) sns.scatterplot(x="comp-1", y="comp-2", hue=df.y.tolist(), palette=sns.color_palette("hls", 3), data=df).set(title="Pump data T-SNE projection")
Единственное, что мы можем изобразить на графике, это то, что есть группы красных и зеленых точек, тогда как синие точки разделены случайным образом. Сюжет не дает конкретных выводов.
Поскольку у нас есть огромный набор функций, включить EDA для каждой из них в эту статью невозможно. Что я сделаю, так это приведу пример с шагами, выполняемыми для одной функции, которые можно применить к любой другой функции для построения графиков и визуализации, чтобы получить полезную информацию.
Исследование числовых переменных
например сумма_tsh
- Постройте блочную диаграмму, чтобы получить крайние значения функции
sns.boxplot(x=df_train['amount_tsh'])
2. Количество насосов со статическим напором менее 0
df_train[df_train['amount_tsh']<0].shape[0] 41639
Из общего числа 59400 точек данных только 41639 имеют значение tsh меньше 0, во что очень трудно поверить, поскольку помпы не могут иметь значение tsh меньше 0. Возможно, насосы, расположенные в этих районах, на самом деле не посещались геодезической компанией, которая собирала данные. В качестве альтернативы, общий статический напор для многих насосов может быть просто неизвестен, если он не был записан при первоначальной установке насоса.
Насос с полным статическим напором, равным нулю, не был бы особенно полезен, поскольку он не был бы способен производить воду из источника, расположенного ниже его выходной точки.
3. Диапазон ненулевых значений
x = df_train[df_train['amount_tsh']>0] y = x[x['amount_tsh']<=1000]
Анализ показывает, что 14 771, т. е. большинство ненулевых значений, попадают в диапазон (1 : 1000).
sns.histplot(data=y, x="amount_tsh", legend=True).set(title='amount_tsh value ranging from 1 to 1000')
4. Гистограмма признаков и меток классов
df_tsh = df_final[['id','amount_tsh','status_group']] r = df_tsh[(df_tsh['amount_tsh']>0) & ((df_tsh['amount_tsh']<10000))] sns.histplot(data=r, x="amount_tsh",binwidth=200, hue="status_group", multiple="stack")
5. Информация, полученная в результате изучения функции выше
Остается чуть менее 3000 записей со значениями amount_tsh, превышающими 1000. Такие значения следует исследовать, чтобы определить, действительно ли они являются действительными значениями для переменной. Из этих 3000 записей 2810 находятся в диапазоне (1000:10000)
Гистограммы для значений amount_tsh предполагают, что помпы с относительно большими значениями могут с большей вероятностью быть функциональными, чем помпы с меньшими значениями. Однако, поскольку более высокие значения могут быть выбросами, а действительные значения amount_tsh отсутствуют для более чем 70% записей в наборе данных, маловероятно, что мы сможем сделать какие-либо достоверные прогностические выводы из графиков.
Исследование категориальных переменных
например код_региона
- Количество уникальных категорий, содержащихся в функции
len(list(df_train['region_code'].unique())) 27
2. 10 региональных кодов с наибольшим количеством насосов
df_reg_c=df_train.groupby(['region_code']).count() df_reg_c['id'].sort_values(ascending=False).head(10) region_code 11 5300 17 5011 12 4639 3 4379 5 4040 18 3324 19 3047 2 3024 16 2816 10 2640 Name: id, dtype: int64
3. Гистограмма признаков и меток классов
plt.figure(figsize=(20,6)) sns.histplot(data=df_final, x="region_code", hue="status_group",binwidth=1, multiple="stack")
4. Информация, полученная в результате изучения функции выше
Сводная статистика, показанная ниже, указывает в общей сложности на 27 различных кодов регионов в наборе данных, причем каждая запись имеет допустимое значение.
Непонятно, почему мы находим 27 значений region_code, в то время как для переменной региона есть только 20 возможных значений.
График состояния насосов относительно каждого значения переменной region_code показывает еще большие различия между географическими регионами для функциональных насосов, от 8,7% в Регионе 8 до почти 97% в Регионе 24. Регион 16 показывает необычно большие 21,4% его насосы имеют статус «работа требует ремонта», в то время как единственный насос Района 40 (100% насосов в этом регионе) не работает.
2. Начальные предиктивные предпочтения (полученные при использовании EDA):
Гистограммы, показанные выше, позволяют нам получить представление о некоторых прогностических аспектах данных. Графики показывают, что большинство категориальных переменных на самом деле содержат значимые прогностические характеристики. Например, мы находим географическую изменчивость в отношении функционального состояния насосов с помощью таких переменных, как бассейн и регион.
Дополнительную изменчивость в функциональном состоянии насосов можно найти с помощью таких переменных, как управление_схемой, год_постройки, общественное_собрание, тип_извлечения, управление, оплата, источник, количество, качество_воды и waterpoint_type.
Графики для числовых переменных показывают, что gps_height, долгота и широта также содержат прогностические характеристики. strong>, в то время как население и amount_tsh, вероятно, имеют меньшую прогностическую ценность.
Эта изменчивость свидетельствует о прогностической ценности переменных.
Например-
Насосы, расположенные в бассейне озера Ньяса, с гораздо большей вероятностью будут функционировать, чем насосы, расположенные в бассейне Южного побережья (65,4% против 37,2%).
Относительно более новые насосы с большей вероятностью будут функциональными, чем относительно старые насосы (см. график для года постройки).
Кроме того, насосы, расположенные в районе Аруши, более чем в два раза чаще функционируют, чем насосы, обнаруженные в районе Линди (68,5% против 29,8%).
Насосы, которые требуют какой-либо оплаты за использование, с гораздо большей вероятностью будут функциональными, чем насосы, которые не требуют оплаты (см. график оплаты).
Подобные типы выводов могут быть постулированы в отношении функциональных состояний, требующих ремонта, и нефункциональных состояний.
Такие выводы полезны для целей построения модели, поскольку они предполагают, что многие переменные/комбинации переменных, обнаруженные в наборе данных, являются сильными кандидатами на включение в перспективную модель прогнозирования/классификации.
3. Очистка и подготовка данных
Чтение и слияние данных
#Importing the Data Sets ## Importing the Training set values train_data = pd.read_csv('Training Set.csv') ## Importing Class labels train_labels = pd.read_csv('Training Set Labels.csv') #Combining the training_values and training_lables training_df = pd.merge(train_data, train_labels)
Отбрасывание функций со сходством
training_df = training_df.drop(['id','source','wpt_name', 'num_private','district_code','region_code','quantity', 'quality_group','lga','ward','management', 'payment', 'extraction_type_group','extraction_type_class','waterpoint_type_group','recorded_by'],axis = 1)
Группа признаков -
- тип_извлечения, группа_тип_извлечения, класс_типа_извлечения
- платеж, тип_платежа
- качество_воды, группа_качества
- источник, исходный_класс
- поселок, регион, код_региона, код_района, лга, район
- Waterpoint_type, Waterpoint_type_group
Прежде всего, группы признаков содержат одинаковое представление данных в разных гранулах. Следовательно, мы рискуем переобучить наши данные во время обучения, включив все функции в наш анализ.
- id можно отбросить, потому что он уникален для каждого экземпляра. мы не можем извлечь из него большую прогностическую изменчивость.
- num_private составляет прибл. 99% нули.
training_df.recorded_by.value_counts() GeoData Consultants Ltd 59400 Name: recorded_by, dtype: int64
- Похоже, что каждая запись записывается GeoData, и это больше не влияет на нашу модель, поэтому мы можем ее удалить.
Глядя на данные, некоторые функции, которые казались дискриминационными, основанными на человеческой интуиции, например. amount_tsh(количество воды, доступное для точки водоснабжения).
Поскольку у нас есть огромный набор функций, в этой статье невозможно включить предварительную обработку для каждой из них. Что я сделаю, так это приведу пример с шагами, выполняемыми для одной функции.
Работа с нулевыми/нулевыми значениями
- Категориальные переменные (например, спонсор)
training_df.funder.value_counts().head(10) Government Of Tanzania 9084 Danida 3114 Hesawa 2202 Rwssp 1374 World Bank 1349 Kkkt 1287 World Vision 1246 Unicef 1057 Tasaf 877 District Council 843 Name: funder, dtype: int64
Для функций с высокой арностью давайте сохраним первые 10 значений в зависимости от частоты и назначим все оставшиеся значения 11-му синтетическому значению как «другие».
Создание пользовательской функции для вышеуказанной цели:
def funder_cl(row): '''Keepig most frequent feature value for funder and assining other to non-frequent feature value''' if row['funder']=='Government Of Tanzania': return 'gov' elif row['funder']=='Danida': return 'danida' elif row['funder']=='Hesawa': return 'hesawa' elif row['funder']=='Rwssp': return 'rwssp' elif row['funder']=='World Bank': return 'world_bank' elif row['funder']=='Kkkt': return 'Kkkt' elif row['funder']=='World Vision': return 'World Vision' elif row['funder']=='Unicef': return 'Unicef' elif row['funder']=='Tasaf': return 'Tasaf' elif row['funder']=='District Council': return 'District Council' else: return 'other' training_df['funder'] = training_df.apply(lambda row: funder_cl(row), axis=1)
2. Числовые переменные
- Добавление новой функции — «days_since_recorded»
Добавьте новый столбец/функция с именем days_since_recorded (который получается путем вычитания date_recorded из последней записанной даты), чтобы мы получили новый столбец, который содержит no. дней с момента записи. Самые последние данные за 2013–12–03 гг. Вычтите каждую дату из этой точки, чтобы получить столбец «days_since_recorded».
training_df.date_recorded = pd.datetime(2013, 12, 3) - pd.to_datetime(training_df.date_recorded) training_df.columns = ['days_since_recorded' if x=='date_recorded' else x for x in training_df.columns] training_df.days_since_recorded = training_df.days_since_recorded.astype('timedelta64[D]').astype(int)
- Долгота и широта
Замена средними значениями для 1812 таких случаев, когда долгота = 0 и широта › -1
training_df['longitude'] = training_df['longitude'].map( lambda x : training_df.longitude.mean() if x == 0 else x) training_df['latitude'] = training_df['latitude'].map( lambda x : training_df.latitude.mean() if x > -1 else x)
4. Проверка окончательных обработанных функций набора
training_df.shape (59400, 25)
Окончательный набор функций:
Мы отобрали 25 (включая метку класса) набор функций на основе выводов EDA.
list(training_df.columns) ['amount_tsh','days_since_recorded','funder','gps_height','installer','longitude','latitude','basin','subvillage','region','population','public_meeting','scheme_management','scheme_name','permit','construction_year','extraction_type','management_group','payment_type','water_quality','quantity_group','source_type','source_class','waterpoint_type']
Экспорт наборов данных для моделирования
training_df.to_csv('training_data.csv', index=True)
Экспорт обработанных и очищенных данных в формат csv
для моделирования.
5. Разработка функций
Импорт обработанного набора данных
Удаление метки класса из нашего набора функций.
train = pd.read_csv('training_data.csv')training = train.drop('status_group', axis=1)
Категориальное преобразование данных с использованием пользовательской функции
Создана пользовательская функция для категориального преобразования данных на основе уникальных значений.
def transform_feature(df, column_name): ''' Categorical data transformation based on unique values''' unique_values = set(df[column_name].tolist()) transformer_dict = {} for index, value in enumerate(unique_values): transformer_dict[value] = index df[column_name] = df[column_name].apply(lambda y: transformer_dict[y]) return df
Применение функции только к категориальным переменным в обработанном наборе данных -
numerical_columns = ['days_since_recorded', 'population','gps_height','amount_tsh','longitude','latitude'] columns_to_transform = [col for col in training.columns if col not in numerical_columns] for column in columns_to_transform: training = transform_feature(training, column)
Преобразование числовых данных с использованием пользовательской функции
Создана пользовательская функция для нормализации столбцов фрейма данных.
Reference def normalize(df): '''Normalizes Column of a dataframe''' result = df.copy() for feature_name in df.columns: max_value = df[feature_name].max() min_value = df[feature_name].min() result[feature_name] = (df[feature_name] - min_value) / (max_value - min_value) return result training = normalize(training)
6. Первоначальный подход перед выбором модели
Данные очень нелинейны, и задним числом трудно найти какую-либо закономерность. Ясно одно: линейные модели не будут работать с таким набором данных.
Мы должны использовать модели Ensemble для эффективного решения, такие как RF и GBDT.
7. Выбор модели
Преобразование кадра данных обучения в матрицу
X = training.to_numpy()
Преобразование меток класса с помощью Label Encoder
from sklearn import preprocessing le = preprocessing.LabelEncoder() train['categorical_label'] = le.fit_transform(train.status_group) list(le.classes_) ['functional', 'functional needs repair', 'non functional']
Разделение набора данных на Test и Train
import sklearn.model_selection X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X, y, test_size = 0.3, random_state = 32)
Различные модельные эксперименты
Классификатор случайного леса (лучшая модель)
Случайный лес — лучшая модель, найденная после показанных ниже экспериментов, проведенных с набором данных с использованием каждой модели. В этой статье невозможно упомянуть все модели. Ознакомьтесь с кодом в конце статьи.
"Ссылка"
# Create the random grid random_grid = {'n_estimators': n_estimators, 'max_features': max_features, 'max_depth': max_depth, 'min_samples_split': min_samples_split, 'min_samples_leaf': min_samples_leaf, 'bootstrap': bootstrap} pprint(random_grid) {'bootstrap': [True, False], 'max_depth': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, None], 'max_features': ['auto', 'sqrt'], 'min_samples_leaf': [1, 2, 4], 'min_samples_split': [2, 5, 10], 'n_estimators': [200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000]}
RandomGridSearchCV для поиска лучших гиперпараметров:
Мы можем использовать различные метрики для моделирования. Я показываю фрагменты кода для точности; то же самое можно применить к «f1_score» и т. д.
- Оценка — Точность
rf = RandomForestClassifier() rf_random = RandomizedSearchCV(estimator = rf, param_distributions = random_grid, n_iter = 100, cv = 3, verbose=10, random_state=42, n_jobs = -1) # Fit the random search model rf_random.fit(X_train, y_train) rf_random.best_params_ {'n_estimators': 1600, 'min_samples_split': 5, 'min_samples_leaf': 1, 'max_features': 'auto', 'max_depth': 90, 'bootstrap': True}
Выше приведены лучшие параметры, полученные для наших данных при обучении 300 моделей различных комбинаций параметров с использованием перекрестной проверки Random Search.
Подгонка Используя лучшие параметры модели RF
rfc.fit(X_train, y_train) RandomForestClassifier(max_depth=90, min_samples_split=5, n_estimators=1600,n_jobs=-1, oob_score=True, random_state=42)
Важность функции
print(rfc.feature_importances_) [0.02886458 0.07270515 0.02337039 0.05744925 0.01969796 0.10710557 0.10673565 0.01854136 0.06714418 0.02934072 0.04184617 0.0104519 0.02048092 0.03521897 0.01241416 0.03239167 0.04169124 0.0084379 0.03840649 0.01380051 0.10570243 0.02704763 0.00779811 0.07335709]
Оценка точности
print('Random Forest Classifier Train Accuracy Score :', np.round(100 * rfc.score(X_train, y_train),2)) Random Forest Classifier Train Accuracy Score : 96.54 print('Random Forest Classifier Accuracy Test Score :', np.round(100 * rfc.score(X_test, y_test),2)) Random Forest Classifier Accuracy Test Score : 81.13
Сюжет АУК-РПЦ
plot_ROC_curve(rfc, X_train, y_train, X_test, y_test)
Отчет о классификации
y_pred = rfc.predict(X_test) report = classification_report(y_test, y_pred)
Матрица путаницы
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay cmd = ConfusionMatrixDisplay.from_estimator(rfc,X_train,y_train, display_labels=['functional','needs repair','non functional'],cmap='Blues') plt.title('Confusion Matrix for Train Data')
8. Обоснование выбора модели — RANDOM FOREST
- Мы можем заметить, что одиночный DT менее точен и надежен, чем Random Forest.
- Цель методов ансамбля состоит в том, чтобы объединить прогнозы нескольких базовых оценок, построенных с помощью заданного алгоритма обучения, чтобы улучшить обобщаемость/надежность по сравнению с одной оценкой.
- Большее количество деревьев повышает производительность и делает прогнозы более стабильными, но также замедляет скорость вычислений.
- Диапазон прогнозов, которые может сделать случайный лес, ограничен самой высокой и самой низкой метками в обучающих данных. Поскольку функции, которые у нас есть, являются стандартными по своей природе, мы не столкнемся с такой экстремальной проблемой точек данных.
- Что наиболее важно, из-за нелинейного характера набора данных мы будем использовать RF, который обычно используется для классификации нелинейно разделимых данных.
9. Резюме модели
1. Изменение некоторых параметров при использовании оценки f1 дало мне на 5% более точную классификацию для класса 1, что очень важно.
2. Мне удалось сократить число оценщиков с 1600 до 200, что помогло модели выполнять более быструю оценку.
10. Сохранение наших лучших моделей
import pickle # save the model to disk filename = 'finalized_model.sav' pickle.dump(rfc_f1, open(filename, 'wb'))
Будущая работа
- Будущая работа может включать в себя расширение нашего инструмента визуализации для включения методов теории графов в целях выявления групп насосов, которые нуждаются в ремонте.
- Такая функциональность может предоставить Министерству водного хозяйства способ повысить эффективность его ремонтных работ, например, ремонтные бригады могут быть развернуты в кластерах проблемных насосов и т. д.
- Мы могли бы собрать точные данные о населении из внешних источников и добавить их в наш набор данных, а также проверить, влияет ли население в определенных областях на функциональное состояние насоса, что может помочь им предсказать области и проявить больше осторожности в этой области.
- Будущая работа также может включать разработку и обучение алгоритма классификации нейронной сети, чтобы определить, улучшит ли такой подход результаты, которые мы задокументировали здесь.
Расположение проекта:
Использованная литература :
- https://www.drivendata.org/competitions/7/pump-it-up-data-mining-the-water-table/page/23/
- https://rstudio-pubs-static.s3.amazonaws.com/339668_006f4906390e41cea23b3b786cc0230a.html
- https://towardsdatascience.com/predicting-the-functional-status-of-pumps-in-tanzania-355c9269d0c2
об авторе
Алиасгар Мохаммеди — выпускник B-Tech с 3-летним опытом работы в области механики. В настоящее время он проходит курс/сертификацию по машинному обучению и искусственному интеллекту от Applied AI.
Вы можете связаться с ним в LinkedIn.