Набор данных

Я использовал набор данных Bank Customer Churn от Kaggle. Он содержит 13 функций и 10000 строк.

Импортировать необходимые библиотеки

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from scipy import stats

Прочитать набор данных

df = pd.read_csv(‘file.csv’)
df.head()

Исследование и очистка данных

df.describe()

Корреляционный анализ

df.corr()

Тепловая карта корреляции

ax=sns.heatmap(df.corr(),annot=True,fmt=’.1g’,cmap=’coolwarm’)
ax.get_ylim()
ax.set_ylim(11.0,-2.0)

Метод Z-оценки для обнаружения и удаления выбросов

numeric_df=df[[‘CreditScore’,’Age’,’Tenure’,’Balance’,’EstimatedSalary’,’NumOfProducts’]]
from scipy import stats
import numpy as np
z=np.abs(stats.zscore(numeric_df))
print(z)
threshold=3
print(np.where(z>3))
# remove outliers
df_nooutlier=df[(z<3).all(axis=1)]
print(df.shape) 
print(df_nooutlier.shape) 

##The result shows that we have removed 201 rows from the old file and name the new file as “df_nooutlier”.

Предварительная обработка данных

X=df_nooutlier[[‘CreditScore’,’Geography’,’Gender’,’Age’,’Tenure’,’Balance’,’NumOfProducts’,’HasCrCard’,’IsActiveMember’,’EstimatedSalary’]].values
y=df_nooutlier["Exited"]
#transform categorical variables
from sklearn import preprocessing
le_Geography = preprocessing.LabelEncoder()
le_Geography.fit([‘France’,’Spain’,’Germany’])
X[:,1] = le_Geography.transform(X[:,1])
le_Gender = preprocessing.LabelEncoder()
le_Gender.fit([ ‘Male’,’Female’])
X[:,2] = le_Gender.transform(X[:,2])
X[0:5]

Как видите, теперь столбец «География» и «Пол» изменился на числовые переменные.

Разделение данных

Разделите набор данных на 70% обучающих данных и 30% тестовых данных.

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=0)

Построение модели дерева решений

# Import Decision Tree Classifier
from sklearn.tree import DecisionTreeClassifier 
# Create Decision Tree classifer object
clf2 = DecisionTreeClassifier()
#Predict the response for test dataset
clf2.fit(X_train,y_train)
#Predict the response for test dataset
y_pred = clf2.predict(X_test)

Особенности важности

df = pd.DataFrame(data = clf2.feature_importances_, index=[‘CreditScore’,’Geography’,’Gender’,’Age’,’Tenure’,’Balance’,’NumOfProducts’,’HasCrCard’,’IsActiveMember’,’EstimatedSalary’], columns=[‘importance’])
feature_importances = df.sort_values(‘importance’,ascending=False)
feature_importances

Вывод

from sklearn.metrics import classification_report
print(classification_report(y_test,y_pred))

from sklearn.metrics import confusion_matrix
print(confusion_matrix(y_test, y_pred))

##The accuracy is 79%, which is not bad at all.

Из нашей матрицы путаницы мы заключаем, что:

Истинный положительный результат: 2055 (Мы предсказали положительный результат, и он оказался положительным)
Истинный отрицательный результат: 276 (Мы предсказали отрицательный результат, и он оказался отрицательным)
Ложноположительный результат: 323 (Мы предсказали положительный результат, и он был отрицательным)
Ложноотрицательный: 286 (Мы прогнозировали отрицательный результат, и он оказался положительным)

Коэффициент ошибок = (FP+FN)/всего = (323+286)/2940 = 0,2

Построение модели случайного леса

#Import Random Forest Model
from sklearn.ensemble import RandomForestClassifier
#Create a Gaussian Classifier
clf=RandomForestClassifier(n_estimators=100)
#Train the model using the training sets y_pred=clf.predict(X_test)
clf.fit(X_train,y_train)
y_pred=clf.predict(X_test)

Особенности важности

df = pd.DataFrame(data = clf.feature_importances_, index=[‘CreditScore’,’Geography’,’Gender’,’Age’,’Tenure’,’Balance’,’NumOfProducts’,’HasCrCard’,’IsActiveMember’,’EstimatedSalary’], columns=[‘importance’])
feature_importances = df.sort_values(‘importance’,ascending=False)
feature_importances

Вывод

print(classification_report(y_test,y_pred))

print(confusion_matrix(y_test, y_pred))

##The accuracy is 86%, which is relatively high.

Из нашей матрицы путаницы мы заключаем, что:

Истинный положительный результат: 2288 (Мы прогнозировали положительный результат, и он оказался положительным)
Истинный отрицательный результат: 244 (Мы прогнозировали отрицательный результат, и он оказался отрицательным)
Ложноположительный результат: 90 (Мы прогнозировали положительный результат, и он был отрицательным)
Ложноотрицательный: 318 (Мы прогнозировали отрицательный результат, и он оказался положительным)

Коэффициент ошибок = (FP+FN)/всего = (90+318)/2940 = 0,13