Untitled
import numpy as np import pandas as pd from sklearn.model_selection import train_test_split # загружаем класс pipeline from sklearn.pipeline import Pipeline # загружаем классы для подготовки данных from sklearn.preprocessing import OneHotEncoder, OrdinalEncoder, StandardScaler, MinMaxScaler, RobustScaler from sklearn.compose import ColumnTransformer # загружаем класс для работы с пропусками from sklearn.impute import SimpleImputer # загружаем функцию для работы с метриками from sklearn.metrics import roc_auc_score # импортируем класс RandomizedSearchCV from sklearn.model_selection import RandomizedSearchCV # загружаем нужные модели from sklearn.linear_model import LogisticRegression from sklearn.neighbors import KNeighborsClassifier from sklearn.tree import DecisionTreeClassifier RANDOM_STATE = 42 TEST_SIZE = 0.25 # загружаем данные df_full = pd.read_csv('railway_full.csv') X_train, X_test, y_train, y_test = train_test_split( df_full.drop(['Удовлетворён предоставленной услугой','Общая оценка качества предоставленной услуги'], axis=1), df_full['Удовлетворён предоставленной услугой'], test_size = TEST_SIZE, random_state = RANDOM_STATE, stratify = df_full['Удовлетворён предоставленной услугой']) X_train.shape, X_test.shape # создаём списки с названиями признаков ohe_columns = ['Пол', 'Путешествует с детьми', 'Путешествует по работе', 'Тип', 'Оценка качества питания'] ord_columns = ['Оценка комфортности покупки билета онлайн', 'Оценка качества wifi', 'Оценка комфортности времени отправления/прибытия'] num_columns = ['Возраст', 'Расстояние'] # создаём пайплайн для подготовки признаков из списка ohe_columns: заполнение пропусков и OHE-кодирование # SimpleImputer + OHE ohe_pipe = Pipeline( [('simpleImputer_ohe', SimpleImputer(missing_values=np.nan, strategy='most_frequent')), ('ohe', OneHotEncoder(drop='first', handle_unknown='ignore', sparse=False)) ] ) # создаём пайплайн для подготовки признаков из списка ord_columns: заполнение пропусков и Ordinal-кодирование # SimpleImputer + OE ord_pipe = Pipeline( [('simpleImputer_before_ord', SimpleImputer(missing_values=np.nan, strategy='most_frequent')), ('ord', OrdinalEncoder( categories=[ ['нормально', 'хорошо', 'плохо', 'отсутствует'], ['нормально', 'хорошо', 'плохо', 'отсутствует'], ['нормально', 'хорошо', 'плохо'], ], handle_unknown='use_encoded_value', unknown_value=np.nan ) ), ('simpleImputer_after_ord', SimpleImputer(missing_values=np.nan, strategy='most_frequent')) ] ) # создаём общий пайплайн для подготовки данных data_preprocessor = ColumnTransformer( [('ohe', ohe_pipe, ohe_columns), ('ord', ord_pipe, ord_columns), ('num', MinMaxScaler(), num_columns) ], remainder='passthrough' ) # создаём итоговый пайплайн: подготовка данных и модель pipe_final = Pipeline([ ('preprocessor', data_preprocessor), ('models', DecisionTreeClassifier(random_state=RANDOM_STATE)) ]) param_grid = [ # словарь для модели DecisionTreeClassifier() { 'models': [DecisionTreeClassifier(random_state=RANDOM_STATE)], 'models__max_depth': range(2,5), 'models__max_features': range(2,5), 'preprocessor__num': [StandardScaler(), MinMaxScaler(), 'passthrough'] }, # словарь для модели KNeighborsClassifier() { 'models': [KNeighborsClassifier()], 'models__n_neighbors':range(2,5), 'preprocessor__num': [StandardScaler(), MinMaxScaler(), 'passthrough'] }, # словарь для модели LogisticRegression() { 'models': [LogisticRegression( random_state=RANDOM_STATE, solver='liblinear', penalty='l1' )], 'models__C': range(1,5), 'preprocessor__num': [StandardScaler(), MinMaxScaler(), 'passthrough'] } ] randomized_search = RandomizedSearchCV( pipe_final, param_grid, cv=5, scoring='roc_auc', random_state=RANDOM_STATE, n_jobs=-1 ) randomized_search.fit(X_train, y_train) print('Лучшая модель и её параметры:\n\n', randomized_search.best_estimator_) print ('Метрика лучшей модели на тренировочной выборке:', randomized_search.best_score_) # проверьте работу модели на тестовой выборке # рассчитайте прогноз на тестовых данных y_test_pred = randomized_search.best_estimator_.predict(X_test) print(f'Метрика ROC-AUC на тестовой выборке: {roc_auc_score(y_test, y_test_pred)}')
Leave a Comment