【機械学習の道】10個の機械学習分類モデル処理銀行データ

9358 ワード

データと背景:http://archive.ics.uci.edu/ml/datasets/Bank+Marketing
ベースライブラリとデータのインポート
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import os
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import classification_report, confusion_matrix
import warnings
# filter warnings
warnings.filterwarnings('ignore')
#       
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
#       
from matplotlib import rcParams
rcParams['axes.unicode_minus']=False
os.chdir('E:\\kaggle\\    ')
data=pd.read_csv('bank-additional.csv')
→データプレビュー
主に絵を見てデータを見るのです.
data.y.value_counts()
sns.countplot(x='y',data=data)  #   
data.info()
sns.countplot(x='y',data=data) 

【机器学习之路】十个机器学习分类模型处理银行数据_第1张图片正負の例の違いは大きいです.

#                
sns.violinplot(x='y',y='duration',data=data)
data[data.y=='no'].duration.mean()
data[data.y=='yes'].duration.mean()
sns.violinplot(x='y',y='duration',data=data)
【机器学习之路】十个机器学习分类模型处理银行数据_第2张图片は、ユーザの通話の平均時間が長く、購入者が足りない平均時間より長い.購買意欲があるユーザーの方がスタッフと多くの意思疎通をしたいからかもしれません.
-トレーニングモデル
y=data.y
x=data.loc[:,data.columns!='y']
x=pd.get_dummies(x)
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.3,random_state = 1)

#       
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.neural_network import MLPClassifier
from xgboost import XGBClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import AdaBoostClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.ensemble import BaggingClassifier


model_list=[KNeighborsClassifier(),SVC(class_weight='balanced'),LogisticRegression(class_weight='balanced'),DecisionTreeClassifier(class_weight='balanced'),MLPClassifier(alpha=20),XGBClassifier(),RandomForestClassifier(),AdaBoostClassifier(),GradientBoostingClassifier(),BaggingClassifier()]
model_str=['KNN','SVC','Logistic','DecisonTree','XGBoost','RandomForest','MLP','AdaBoost','GradientBoost','Bagging']
precision_=[]
recall_=[]
for name,model in zip(model_str,model_list):
    plt.figure()
    model.fit(x_train,y_train)
    y_pred=model.predict(x_test)
    report=confusion_matrix(y_test,y_pred)
    #sns.heatmap(report,annot=True,fmt="d")
    precision=report[1][1]/(report[:,1].sum())
    precision_.append(str(precision)[:4])
    recall=report[1][1]/(report[1].sum())
    recall_.append(str(recall)[:4])
    print('  :'+name+' precision:'+str(precision)[:4]+' recall:'+str(recall)[:4])

report=pd.DataFrame({'model':model_str,'precision':precision_,'recall':recall_})
訓練結果【机器学习之路】十个机器学习分类模型处理银行数据_第3张图片
  • データを標準化すれば、正確度を上げることができますか?
    scaler=StandardScaler()
    x=data.loc[:,data.columns!='y']
    x_num=x.loc[:,x.dtypes !='object']
    x_object=x.loc[:,x.dtypes=='object']
    x_num_stdard=scaler.fit_transform(x_num)  #          ndarray,           DataFrame
    x_object=pd.get_dummies(x_object)
    x_num_stdard=pd.DataFrame(x_num_stdard)
    x_num_stdard['id']=np.arange(0,len(x),1)
    x_object['id']=np.arange(0,len(x),1)
    x_stdard=pd.merge(x_num_stdard,x_object,on='id',how='left')
    
    x_train1,x_test1,y_train,y_test = train_test_split(x_stdard,y,test_size = 0.3,random_state = 1)
    model_list=[KNeighborsClassifier(),SVC(class_weight='balanced'),LogisticRegression(class_weight='balanced'),DecisionTreeClassifier(class_weight='balanced'),MLPClassifier(alpha=20),XGBClassifier(),RandomForestClassifier(),AdaBoostClassifier(),GradientBoostingClassifier(),BaggingClassifier()]
    model_str=['KNN','SVC','Logistic','DecisonTree','XGBoost','RandomForest','MLP','AdaBoost','GradientBoost','Bagging']
    precision_1=[]
    recall_1=[]
    for name,model in zip(model_str,model_list):
        model.fit(x_train1,y_train)
        y_pred=model.predict(x_test1)
        report=confusion_matrix(y_test,y_pred)
        precision=report[1][1]/(report[:,1].sum())
        precision_1.append(str(precision)[:4])
        recall=report[1][1]/(report[1].sum())
        recall_1.append(str(recall)[:4])
        print('  :'+name+' precision:'+str(precision)[:4]+' recall:'+str(recall)[:4])
    
    report=pd.DataFrame({'model':model_str,'precision':precision_,'recall':recall_,'precision1':precision_1,'recall1':recall_1})
    
    結果から見て、logiticはリコール率が一番高いです.
    萼は神経ネットワークを調整する.
    parameters={'alpha':np.arange(0.1,2,0.1)}
    model=MLPClassifier()
    model_cv=GridSearchCV(model,parameters,cv=5)
    x=pd.get_dummies(x)
    model_cv.fit(x,y)
    print('best parameters:{}'.format(model_cv.best_params_))
    print('best score:{}'.format(model_cv.best_score_))
    
    パラメータが1.6の場合、精度が最高在这里插入图片描述.
    データから
    上記の正負のサンプルはあまりにもかけ離れています.モデルの中にバランスの取れたモデルのパラメータがあっても、訓練結果の正確性とリコール率は高くありません.記事の先頭に与えられたデータ接続には、4万サンプルのデータセットが含まれています.この例は4600、反例は36000個で、逆の例からランダムに4600個を選択して、例として新しいデータセットを構成してトレーニングします.コードは以下の通りです
    データ前処理:バランスプラスマイナスの例
    data_full=pd.read_csv('bank-additional-full.csv')
    data_yes=data[data.y=='yes']
    data_no=data[data.y=='no']
    data_no1=data_no.sample(4640)
    data_balance=pd.concat([data_yes,data_no1],ignore_index=True)
    sns.countplot(x='y',data=data_balance)
    
    正負のサンプル数はバランス【机器学习之路】十个机器学习分类模型处理银行数据_第4张图片に達しています.通話時間が長くて、十分買うかどうかの関係は【机器学习之路】十个机器学习分类模型处理银行数据_第5张图片より明らかになりました.投資信託商品を買う通話時間は明らかに投資信託商品を買うに足りない通話時間より長いです.
    トレーニングモデル
    #         
    y=data_balance.y
    x=data_balance.loc[:,data_balance.columns!='y']
    x=pd.get_dummies(x)
    x_train,x_test,y_train,y_test = train_test_split(x,y,test_size = 0.3,random_state = 1)
    
    
    model_list=[KNeighborsClassifier(),SVC(class_weight='balanced'),LogisticRegression(class_weight='balanced'),DecisionTreeClassifier(class_weight='balanced'),MLPClassifier(alpha=20),XGBClassifier(),RandomForestClassifier(),AdaBoostClassifier(),GradientBoostingClassifier(),BaggingClassifier()]
    model_str=['KNN','SVC','Logistic','DecisonTree','XGBoost','RandomForest','MLP','AdaBoost','GradientBoost','Bagging']
    precision_=[]
    recall_=[]
    for name,model in zip(model_str,model_list):
        #        plt.figure()
        model.fit(x_train,y_train)
        y_pred=model.predict(x_test)
        report=confusion_matrix(y_test,y_pred)
        #sns.heatmap(report,annot=True,fmt="d")
        precision=report[1][1]/(report[:,1].sum())
        precision_.append(str(precision)[:4])
        recall=report[1][1]/(report[1].sum())
        recall_.append(str(recall)[:4])
        print('  :'+name+' precision:'+str(precision)[:4]+' recall:'+str(recall)[:4])
    
    訓練の結果、【机器学习之路】十个机器学习分类模型处理银行数据_第6张图片テストの結果、精度とリコール率は明らかに向上した.正負の試料例の平衡が分類モデルの効果に大きな影響を及ぼすことを示した.