В феврале 2021 года я участвовал в хакатоне DataScience, проводимом AnalyticsVidhya. Это был потрясающий опыт - участвовать в таком веселом испытании, и я многому научился из этого самого первого своего опыта.

Эти задачи действительно помогают выявить бешеную энергию для инкапсуляции всех известных концепций науки о данных, прокладывая себе путь через несколько комбинаций функций, которые лучше всего сочетаются друг с другом для решения текущей проблемы и разрушают мозг, а также нервы для достижения абсолютных лучших результатов. .

Итак, приступим !!!

Постановка проблемы. FinMan, компания, предоставляющая финансовые услуги, предоставляет своим клиентам различные финансовые услуги, такие как ссуды, инвестиционные фонды, страхование и т. д. FinMan желает продавать полисы существующим клиентам, которые могут иметь или не иметь полисы компании.

Целевой результат: компании необходимо построить модель, чтобы предсказать, заинтересует ли человек предлагаемый им план / политику в области здравоохранения с учетом информации о:

  • Демографические данные (город, возраст, регион и т. Д.)
  • Информация о политике владения клиента
  • Рекомендуемая информация о политике

Детали реализации следующие:

А. Исследование данных

  1. Используемые библиотеки: Pandas, Numpy, Seaborn, Matplotlib
  2. Анализ данных с помощью таких функций, как info (), describe () и shape
  3. Проверка количества пропущенных значений в каждой функции с помощью приведенного ниже кода:
df.isnull().sum()

4. Проверьте корреляцию каждой функции с целевой переменной.

sns.heatmap(df.corr())

5. Разделение числовых и категориальных признаков.

#Numerical Features
num_fields=[feature for feature in df.columns if df[feature].dtypes!=’O’ ]
#Categorical features
cat_feature=[feature for feature in df.columns if df[feature].dtypes=='O']

6. Для каждой числовой характеристики проверьте, является ли она дискретной числовой функцией или непрерывной числовой функцией. Здесь все объекты, имеющие уникальные значения менее 30, считаются дискретными, в противном случае - непрерывными объектами.

#Number of unique values 
for feature in num_fields:
 print(‘{}: {} Unique values’.format(feature,df[feature].nunique()))
#Discrete Numerical Features
discrete_feature=[feature for feature in num_fields if df[feature].nunique()<30]
#Continuous Numerical Features
continuous_feature=[feature for feature in num_fields if df[feature].nunique()>30]

7. Проверьте взаимосвязь дискретных функций с целевым столбцом.

а. Здесь «Response» - целевая (зависимая) переменная, и мы группируем счетчик «Holding_Policy_Type» по соответствующим полученным ответам.

for feature in discrete_feature:
 data.groupby(‘Response’)[feature].count().plot.bar()
 plt.xlabel(‘Response’)
 plt.ylabel(feature)
 plt.show()

б. Ниже мы сравниваем количество ответов для каждой категории «Holding_Policy_Type».

sns.countplot(x=df[‘Holding_Policy_Type’],hue=df[‘Response’])

9. Анализ распределения данных для непрерывного объекта. Это помогает нам понять, искажены ли данные и нужно ли применять какое-либо преобразование, такое как преобразование журнала.

for feature in continuous_feature:
 sns.distplot(df[feature])
 plt.title(feature)
 plt.show()

10. Для категориальных функций мы анализируем количество уникальных значений в каждой функции, чтобы понять, какой тип кодирования будет реализован.

Б. Разработка функций

1. Выполните выбор функций, удалив функции на основе:

  • Функции с высоким процентом пропущенных значений
  • Коллинеарные (сильно коррелированные) особенности
  • Функции с нулевой важностью в древовидной модели
  • Особенности с одним уникальным значением

2. Вменение

  • Импутация - это процесс замены отсутствующих данных замененными значениями.
  • Есть несколько способов обработки пропущенных значений в категориальных функциях. В этом случае отсутствующие значения в каждой категориальной характеристике были идентифицированы и заменены «новой категорией».
df[‘Health Indicator’]=np.where(df[‘Health Indicator’].isnull(),’XN’,df[‘Health Indicator’])
  • Для числовых функций отсутствующие значения были заменены на 0
df[‘Holding_Policy_Type’]=df[‘Holding_Policy_Type’].fillna(0)
  • Одна из категорий, являющихся строковым типом, содержала числовые значения, поэтому значения функций были преобразованы в число с плавающей запятой, а отсутствующие значения были заменены на 0.
#Converting the string value into numeric value
df[‘Holding_Policy_Duration’]=df[‘Holding_Policy_Duration’].apply
(lambda x: float(x))
#Replacing the missing values by 0
df['Holding_Policy_Duration']=df['Holding_Policy_Duration'].
fillna(0)

3. Кодировка

  • Кодирование - это обязательный этап предварительной обработки при работе с категориальными данными для преобразования значений в числовой тип.
  • Быстрое кодирование: категориальные функции, состоящие из меньшего количества значений категорий, благодаря эффективному применению однократного кодирования, чтобы избежать проклятия размерности.
pd.get_dummies(df[[‘Accomodation_Type’,’Reco_Insurance_Type’,’Is_Spouse’]],drop_first=True)
  • Целевая кодировка. Мы не можем реализовать быстрое кодирование для категориальных функций, имеющих большее количество категорий, так как это увеличивает количество измерений. С этой целью целевая кодировка была реализована для таких функций, где оценивалось среднее значение для каждой категории в соответствии с целевым столбцом, и каждая метка была заменена соответствующим значением.
values_city_code=round(df.groupby(‘City_Code’)[‘Response’].mean(),3)
df[‘City_Code’]=df[‘City_Code’].map(values_city_code)

4. Масштабирование

  • Масштабирование функций в машинном обучении - один из наиболее важных шагов во время предварительной обработки данных перед созданием модели машинного обучения.
  • Алгоритм машинного обучения просто видит число - если существует огромная разница в диапазоне, скажем, несколько в диапазоне от тысяч и несколько в диапазоне от десятков, и он может сделать базовое предположение, что числа с более высоким диапазоном имеют какое-то превосходство. Таким образом, это более значительное число начинает играть более решающую роль при обучении модели. Следовательно, необходимо привести все значения функций в один и тот же диапазон.
  • Наиболее распространенными методами масштабирования функций являются нормализация и стандартизация.
  • Масштабирование функции, реализованное для этой постановки задачи, - это нормализация с использованием библиотеки MinMaxScaler.
from sklearn.preprocessing import MinMaxScaler
minmax=MinMaxScaler()
minmax.fit(df[features])

5. Хранение данных

  • Опубликуйте все этапы разработки функций, после чего мы сохраняем данные в формате pickle или любом другом подходящем формате, чтобы избежать выполнения вышеуказанных шагов каждый раз, когда мы запускаем код с теми же данными

C. Выбор модели

  1. Нам нужно разделить независимые признаки и зависимые (целевые) признаки при применении модели.
  2. Это постановка задачи классификации, были реализованы такие алгоритмы, как DecisionTreeClassifier, XGBoostClassifier и RandomForestClassifier, и на основе оценки точности и оценки Roc Auc был выбран XGBoostClassifier соответственно.
  3. Для оптимального выбора алгоритма и параметров использовалась гиперпараметрическая настройка.
  4. Выбор алгоритма. Реализована библиотека TPOTClassifier, чтобы понять наилучший алгоритм для набора данных.
from tpot import TPOTClassifier
tpot=TPOTClassifier()
tpot = TPOTClassifier(generations=5, population_size=20, cv=5,random_state=42, verbosity=2)
tpot.fit(X_train, y_train)

5. Выбор параметра:

  • Могут использоваться методы гиперпараметров, такие как RandomSearchCV и GridSearchCV.
  • RandomSearchCV может быть реализован следующим образом, чтобы понять лучшую комбинацию параметров, которая будет использоваться в алгоритме:
#Hyperparameter optimization
params={
 “learning_rate” : [0.05, 0.10, 0.15, 0.20, 0.25, 0.30 ] ,
 “max_depth” : [ 3, 4, 5, 6, 8, 10, 12, 15],
 “min_child_weight” : [ 1, 3, 5, 7 ],
 #The value should be less than 1
 “gamma” : [ 0.0, 0.1, 0.2 , 0.3, 0.4 ],
 #The value should be less than 1
 “colsample_bytree” : [ 0.3, 0.4, 0.5 , 0.7 ]
}
#Implementing RandomSearchCV for hyperparameter tuning
random_search=RandomizedSearchCV(classifier,param_distributions=params,n_iter=5,scoring='roc_auc',n_jobs=-1,cv=5,verbose=3)
random_search.fit(X_train,y_train)
random_search.best_estimator_

6. Результаты, полученные в результате случайного поиска, используются в качестве параметрических значений в XGBoostClassifier с последующим выполнением метода подбора.

import xgboost
classifier=xgboost.XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,colsample_bynode=1, colsample_bytree=0.5, gamma=0.0, gpu_id=-1,importance_type='gain', interaction_constraints='', learning_rate=0.05, max_delta_step=0, max_depth=4,min_child_weight=3,  monotone_constraints='()', n_estimators=100, n_jobs=0, num_parallel_tree=1, random_state=0, reg_alpha=0, reg_lambda=1, scale_pos_weight=1, subsample=1, tree_method='exact', validate_parameters=1, verbosity=None)
classifier.fit(X_train,y_train)

7. Затем мы проверяем точность модели, реализованной на обучающих данных. Поскольку это проблема классификации, мы будем использовать показатель точности и показатель ROC AUC для определения эффективности модели.

from sklearn.metrics import accuracy_score,roc_auc_score
y_pred=classifier.predict(X_train)
#Accuracy Score
acc_score=accuracy_score(y_test,y_pred)
print('Accuracy Score: ',acc_score)
#ROC AUC Score
roc_auc_score=roc_auc_score(y_test,y_pred)
print('ROC AUC Score: ',roc_auc_score)

D. Прогнозирование целевых значений для тестовых данных

  1. Опубликуйте выбор модели, мы спрогнозируем целевые значения для тестовых данных
  2. Все этапы разработки функций, выполняемые для обучающих данных, должны быть реализованы и для тестовых данных.
  3. Мы оцениваем выход задачи классификации, используя метод прогнозирования объекта модели, созданный на этапе обучения.
test_pred=classifier.predict(X_test)

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