首页 > 人工智能 > 机器学习 > 「二分类算法」提供银行精准营销解决方案
import pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport numpy as npimport sklearnfrom sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_splitfrom sklearn.metrics import roc_auc_scorefrom sklearn.metrics import classification_reportfrom sklearn import preprocessingdf_train=pd.read_csv(r"/home/kesci/input/bank_financial4287/train_set.csv")df_test=pd.read_csv(r"/home/kesci/input/bank_financial4287/test_set.csv")df_train.info()df_test.info()df_train.head()df_test.head()df_train.drop(['day','month'],inplace=True,axis=1)df_test.drop(['day','month'],inplace=True,axis=1)df_train.describe()df_test.describe()df_train.duplicated().all()df_train.boxplot()def missing_data(data):
total = data.isin(['unknown']).sum()
percent = (data.isin(['unknown']).sum()/data.isin(['unknown']).count()*100)
tt = pd.concat([total, percent], axis=1, keys=['Total', 'Percent'])
types = []
for col in data.columns:
dtype = str(data[col].dtype)
types.append(dtype)
tt['types'] = types
return(np.transpose(tt))missing_data(df_train)missing_data(df_test)df_train.drop('poutcome',inplace=True,axis=1)df_train.columnsdf_test.drop('poutcome',inplace=True,axis=1)df_test.columnsdf_train['job'].replace(['unknown'],df_train['job'].mode(),inplace=True)df_train['job'].isin(['unknown']).sum()df_test['job'].replace(['unknown'],df_test['job'].mode(),inplace=True)df_test['job'].isin(['unknown']).all()df_train['education'].replace(['unknown'],df_train['education'].mode(),inplace=True)df_train['education'].isin(['unknown']).all()df_test['education'].replace(['unknown'],df_test['education'].mode(),inplace=True)df_test['education'].isin(['unknown']).all()df_train['contact'].replace(['unknown'],df_train['contact'].mode(),inplace=True)df_train['contact'].isin(['unknown']).all()df_test['contact'].replace(['unknown'],df_test['contact'].mode(),inplace=True)df_test['contact'].isin(['unknown']).all()client_purchase=df_train[df_train.loc[:,'y']==1].copy()client_not_purchase=df_train[df_train.loc[:,'y']==0].copy()#两种方法可以计算#buy_rate=df_buy.shape[0]/df_train.shape[0]或者buy_rate=df_train['y'].sum()/df_train.shape[0]pie_data = {'purchase rate': client_purchase.shape[0],
'': df_train.shape[0]-client_purchase.shape[0]}explode = (0.2, 0) # 突出购买率fig1, ax = plt.subplots()sizes=pie_data.values()labels =['{}:{}'.format(key,value) for key,value in pie_data.items()]ax.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',
shadow=True, startangle=90)ax.axis('equal') # 确保圆形plt.show()print("最小的年龄:{}".format(df_train['age'].min()))print("最大的年龄:{}".format(df_train['age'].max()))fg = sns.FacetGrid(data=df_train,height=6,hue='y')fg = (fg.map(sns.distplot,'age',bins=[20,30,40,50,60,70,80,90])
.add_legend())pd.DataFrame(df_train.groupby('job'))[0]fg=sns.catplot(data=df_train,x='job',kind='bar',y='y',ci=None)fg=(fg.set_xticklabels(rotation=90)
.set_axis_labels('','purchase rate')
.despine(left=True))fg=sns.catplot(data=df_train,x='marital',kind='bar',y='y',ci=None,aspect=.8)fg=(fg.set_axis_labels('marital','purchase rate')
.despine(left=True))fg=sns.catplot(data=df_train,x='education',kind='bar',y='y',ci=None,aspect=.6)fg=(fg.set_axis_labels('education','purchase rate')
.despine(left=True))g = sns.catplot(x='job', y='y', col='education',
data=df_train, saturation=.5,
kind='bar', col_order=['primary','secondary','tertiary'],
aspect=1.2,ci=None)g = (g.set_axis_labels('job', 'purchase rate')
.set_xticklabels(rotation=90)
.set_titles('{col_name} {col_var}')
.despine(left=True))fg=sns.catplot(data=df_train,x='default',kind='bar',y='y',ci=None,order=['yes','no'])fg.set_axis_labels("default",'purchase rate')fg=sns.catplot(data=df_train,x='housing',kind='bar',y='y',ci=None,order=['yes','no'])fg.set_axis_labels("housing",'purchase rate')fg=sns.catplot(data=df_train,x='loan',kind='bar',y='y',ci=None,order=['yes','no'])fg.set_axis_labels("loan",'purchase rate')fg=sns.catplot(data=df_train,x='contact',kind='bar',y='y',ci=None)fg.set_axis_labels("contact",'purchase rate')fg=sns.catplot(data=df_train,x='campaign',kind='bar',y='y',ci=None,aspect=2)fg.set_axis_labels("campaign",'purchase rate')fg = sns.FacetGrid(data=df_train,height=6,hue='y')fg = (fg.map(sns.distplot,'duration',bins=40)
.add_legend())fig,axes=plt.subplots(1,3)#pearson系数ax0=axes[0].imshow(X=df_train.corr())#kendall系数ax1=axes[1].imshow(X=df_train.corr(method='kendall'))#spearman系数ax2=axes[2].imshow(X=df_train.corr(method='spearman'))fig.colorbar(ax0,ax=[axes[0],axes[1],axes[2]])fig.set_size_inches(30,8)##当然可以使用sns.heatmap函数还可以显示对应的值sns.heatmap(data=df_train.corr(),annot=True)# 尝试过LabelEncoder编码,评分只有0.6293498143665042# 采用哑变量进行编码train_data=pd.get_dummies(df_train.iloc[:,:-1])train_data.drop('ID',inplace=True,axis=1)train_target=df_train.loc[:,'y']print(train_data.head())train_data.columns.size#划分训练集和验证集X_train, X_test, y_train, y_test = train_test_split(train_data, train_target, test_size=0.2, random_state=0)LR=LogisticRegression(solver='liblinear')#对训练集X_train训练LR.fit(X_train,y_train)#给出训练的精度LR.score(X_train,y_train)train_data.head()#对于验证集x_test进行预测x_pre_test=LR.predict(X_test)x_pre_testprint(classification_report(y_test, x_pre_test))x_pro_test = LR.predict_proba(X_test)print("验证集的预测可能性:{}".format(x_pro_test))#计算验证集的auc值,参数为预测值和概率估计auc=roc_auc_score(y_test, x_pro_test[:, 1])print("auc的值:{}".format(auc))LR=LogisticRegression(solver='liblinear',penalty='l1')LR.fit(X_train,y_train)LR.score(X_train,y_train)x_pre_test=LR.predict(X_test)print("训练集的预测结果: {}".format(x_pre_test))print("分类报告:\n {}".format(classification_report(y_test, x_pre_test)))x_pro_test = LR.predict_proba(X_test)print("训练集的预测可能性:\n{}".format(x_pro_test))auc=roc_auc_score(y_test, x_pro_test[:, 1])print("auc值:{}".format(auc))bins = np.arange(18,100,10,int) binstrain_data['age'] = np.digitize(df_train['age'], bins=bins)df_test['age'] = np.digitize(df_test['age'], bins=bins)#划分训练集和验证集X_train, X_test, y_train, y_test = train_test_split(train_data, train_target, test_size=0.2, random_state=0)train_data.head()LR.fit(X_train,y_train)LR.score(X_train,y_train)x_pre_test=LR.predict(X_test)print("训练集的预测结果: {}".format(x_pre_test))print("分类报告:\n {}".format(classification_report(y_test, x_pre_test)))x_pro_test = LR.predict_proba(X_test)print("训练集的预测可能性:\n{}".format(x_pro_test))auc=roc_auc_score(y_test, x_pro_test[:, 1])print("auc值:{}".format(auc))#自己的电脑可以klab这里运行显示没有模块from imblearn.over_sampling import SMOTEoversampler=SMOTE(random_state=0)os_train_data,os_train_target=oversampler.fit_sample(train_data,train_target)#划分训练集和验证集X_train, X_test, y_train, y_test = train_test_split(os_train_data, os_train_target, test_size=0.2, random_state=0)os_train_datadf_testLR=LogisticRegression(solver='liblinear')LR.fit(X_train,y_train)LR.score(X_train,y_train)x_pre_test=LR.predict(X_test)print("训练集的预测结果: {}".format(x_pre_test))print("分类报告:\n {}".format(classification_report(y_test, x_pre_test)))x_pro_test = LR.predict_proba(X_test)print("训练集的预测可能性:\n{}".format(x_pro_test))auc=roc_auc_score(y_test, x_pro_test[:, 1])print("auc值:{}".format(auc))df_out=pd.DataFrame(df_test['ID'].copy())df_test.drop('ID',inplace=True,axis=1)df_test=pd.get_dummies(df_test)#对测试集df_test进行预测y_pre_test=LR.predict(df_test)y_pre_testdf_test#预测df_test分类的可能性y_test_pro=LR.predict_proba(df_test)y_test_prodf_out['pred']=y_test_pro[:,1]df_out=df_out[['ID','pred']]df_out.head()df_out.to_csv(r'./result.csv',index=False)
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69977871/viewspace-2700684/ ,如需转载,请注明出处,否则将追究法律责任。