import numpy as np
import pandas as pd
from sklearn.metrics import accuracy_score, f1_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from xgboost import XGBClassifier
Посмотрим на примере данных по оттоку клиентов из телеком-компании.
df = pd.read_csv("../../data/telecom_churn.csv")
df.head()
Штаты просто занумеруем, а признаки International plan (наличие международного роуминга), Voice mail plan (наличие голосовой почтыы) и целевой Churn сделаем бинарными.
state_enc = LabelEncoder()
df["State"] = state_enc.fit_transform(df["State"])
df["International plan"] = (df["International plan"] == "Yes").astype("int")
df["Voice mail plan"] = (df["Voice mail plan"] == "Yes").astype("int")
df["Churn"] = (df["Churn"]).astype("int")
Разделим данные на обучающую и тестовую выборки в отношении 7:3.
X_train, X_test, y_train, y_test = train_test_split(
df.drop("Churn", axis=1),
df["Churn"],
test_size=0.3,
stratify=df["Churn"],
random_state=17,
)
'objective':'binary:logistic'
)'max_depth':3
)'silent':1
)'eta':1
) - алгоритм будет обучаться быстро и "агрессивно" (лучше результаты будут, если уменьшить eta и увеличить число итераций)params = {
"objective": "binary:logistic",
"max_depth": 3,
"learning_rate": 1.0,
"silent": 1.0,
"n_estimators": 50,
}
Тут мы просто передаем слоавть параметров, данные и число итераций.
xgb_model = XGBClassifier(**params).fit(X_train, y_train)
preds_prob = xgb_model.predict(X_test)
Посчитаем долю правильных ответов алгоритма на тестовой выборке.
predicted_labels = preds_prob > 0.5
print(
"Accuracy and F1 on the test set are: {} and {}".format(
round(accuracy_score(y_test, predicted_labels), 3),
round(f1_score(y_test, predicted_labels), 3),
)
)