В феврале 2021 года я участвовал в хакатоне DataScience, проводимом AnalyticsVidhya. Это был потрясающий опыт - участвовать в таком веселом испытании, и я многому научился из этого самого первого своего опыта.
Эти задачи действительно помогают выявить бешеную энергию для инкапсуляции всех известных концепций науки о данных, прокладывая себе путь через несколько комбинаций функций, которые лучше всего сочетаются друг с другом для решения текущей проблемы и разрушают мозг, а также нервы для достижения абсолютных лучших результатов. .
Итак, приступим !!!
Постановка проблемы. FinMan, компания, предоставляющая финансовые услуги, предоставляет своим клиентам различные финансовые услуги, такие как ссуды, инвестиционные фонды, страхование и т. д. FinMan желает продавать полисы существующим клиентам, которые могут иметь или не иметь полисы компании.
Целевой результат: компании необходимо построить модель, чтобы предсказать, заинтересует ли человек предлагаемый им план / политику в области здравоохранения с учетом информации о:
- Демографические данные (город, возраст, регион и т. Д.)
- Информация о политике владения клиента
- Рекомендуемая информация о политике
Детали реализации следующие:
А. Исследование данных
- Используемые библиотеки: Pandas, Numpy, Seaborn, Matplotlib
- Анализ данных с помощью таких функций, как info (), describe () и shape
- Проверка количества пропущенных значений в каждой функции с помощью приведенного ниже кода:
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. Выбор модели
- Нам нужно разделить независимые признаки и зависимые (целевые) признаки при применении модели.
- Это постановка задачи классификации, были реализованы такие алгоритмы, как DecisionTreeClassifier, XGBoostClassifier и RandomForestClassifier, и на основе оценки точности и оценки Roc Auc был выбран XGBoostClassifier соответственно.
- Для оптимального выбора алгоритма и параметров использовалась гиперпараметрическая настройка.
- Выбор алгоритма. Реализована библиотека 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. Прогнозирование целевых значений для тестовых данных
- Опубликуйте выбор модели, мы спрогнозируем целевые значения для тестовых данных
- Все этапы разработки функций, выполняемые для обучающих данных, должны быть реализованы и для тестовых данных.
- Мы оцениваем выход задачи классификации, используя метод прогнозирования объекта модели, созданный на этапе обучения.
test_pred=classifier.predict(X_test)
Надеюсь, что эта статья была содержательной и полезной инициативой, чтобы начать с решения проблем науки о данных.