Набор данных
Я использовал набор данных 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