【機械学習の道】10個の機械学習分類モデル処理銀行データ
9358 ワード
データと背景:http://archive.ics.uci.edu/ml/datasets/Bank+Marketing
ベースライブラリとデータのインポート
主に絵を見てデータを見るのです.
-トレーニングモデルデータを標準化すれば、正確度を上げることができますか?
萼は神経ネットワークを調整する.
データから
上記の正負のサンプルはあまりにもかけ離れています.モデルの中にバランスの取れたモデルのパラメータがあっても、訓練結果の正確性とリコール率は高くありません.記事の先頭に与えられたデータ接続には、4万サンプルのデータセットが含まれています.この例は4600、反例は36000個で、逆の例からランダムに4600個を選択して、例として新しいデータセットを構成してトレーニングします.コードは以下の通りです
データ前処理:バランスプラスマイナスの例
トレーニングモデル
ベースライブラリとデータのインポート
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)
正負の例の違いは大きいです.
#
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)
は、ユーザの通話の平均時間が長く、購入者が足りない平均時間より長い.購買意欲があるユーザーの方がスタッフと多くの意思疎通をしたいからかもしれません.-トレーニングモデル
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_})
訓練結果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)
正負のサンプル数はバランスに達しています.通話時間が長くて、十分買うかどうかの関係はより明らかになりました.投資信託商品を買う通話時間は明らかに投資信託商品を買うに足りない通話時間より長いです.トレーニングモデル
#
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])
訓練の結果、テストの結果、精度とリコール率は明らかに向上した.正負の試料例の平衡が分類モデルの効果に大きな影響を及ぼすことを示した.