机器学习训练营——机器学习爱好者的自由交流空间(qq群号:696721295)
案例介绍
桑坦德银行(Santander Bank)创立于1857年,是西班牙最大银行、欧洲第二大银行。它的业务和服务包括零售银行、商业银行、投资银行、私人银行、保险、资产管理、私人投资等。本案例根据桑坦德银行提供的客户数据,预测客户未来的交易行为。
-
代码实现:Python
-
数据来源: Santander
数据描述
隐去了客户个人信息的数据集,包括数值特征变量、二值target变量、字符型ID_code变量。我们的任务是预测检验集里的target值。
加载包
导入库
from sklearn.model_selection import train_test_split
from sklearn.model_selection import StratifiedKFold
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
from catboost import CatBoostClassifier,Pool
from IPython.display import display
import matplotlib.patches as patch
import matplotlib.pyplot as plt
from sklearn.svm import NuSVR
from scipy.stats import norm
from sklearn import svm
import lightgbm as lgb
import xgboost as xgb
import seaborn as sns
import pandas as pd
import numpy as np
import warnings
import time
import glob
import sys
import os
import gc
from sklearn.model_selection import train_test_split
from sklearn.model_selection import StratifiedKFold
from IPython.display import display
import matplotlib.patches as patch
import matplotlib.pyplot as plt
from scipy.stats import norm
import seaborn as sns
import pandas as pd
import numpy as np
import warnings
import time
import glob
import sys
import os
import gc
设置
# for get better result chage fold_n to 5
fold_n=5
folds = StratifiedKFold(n_splits=fold_n, shuffle=True, random_state=10)
warnings.filterwarnings('ignore')
plt.style.use('ggplot')
np.set_printoptions(suppress=True)
pd.set_option("display.precision", 15)
版本
print('pandas: {}'.format(pd.__version__))
print('numpy: {}'.format(np.__version__))
print('Python: {}'.format(sys.version))
pandas: 0.22.0
numpy: 1.14.1
Python: 3.6.3 (v3.6.3:2c5fed8, Oct 3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)]
问题定义
在这里,我们要帮助银行方面识别哪些客户将在未来做一个特定的交易,不论交易金额是多少。具体上说,我们的任务是预测检验集的target的值,它是一个二值变量。
探索性数据分析
在这一节,我们将使用图形和数值技术探索数据的意义。主要包括:
-
数据收集
-
可视化
-
数据预处理
-
数据清洗
显示数据所在目录里的文件。
print(os.listdir("../input/"))
[‘test.csv’, ‘test.csv.zip’, ‘train.csv’, ‘train.csv.zip’]
print(os.listdir("e:/kaggle_exercises/santander/input/"))
导入训练集与检验集。
train= pd.read_csv("../input/train.csv")
test = pd.read_csv('../input/test.csv')
train= pd.read_csv("e:/kaggle_exercises/santander/input/train.csv")
test = pd.read_csv('e:/kaggle_exercises/santander/input/test.csv')
print(train.shape), print(test.shape)
(200000, 202)
(200000, 201)
显示训练集前5行,观察数据结构。
print(train.head(5))
数据集的内存使用大小为300M, 为了减少内存开销,我们打算缩减一半大小的数据量。为此,我们定义一个减少内存使用的函数。
def reduce_mem_usage(df):
start_mem_usg = df.memory_usage().sum() / 1024**2
print("Memory usage of properties dataframe is :",start_mem_usg," MB")
NAlist = [] # Keeps track of columns that have missing values filled in.
for col in df.columns:
if df[col].dtype != object: # Exclude strings
# Print current column type
print("******************************")
print("Column: ",col)
print("dtype before: ",df[col].dtype)
# make variables for Int, max and min
IsInt = False
mx = df[col].max()
mn = df[col].min()
# Integer does not support NA, therefore, NA needs to be filled
if not np.isfinite(df[col]).all():
NAlist.append(col)
df[col].fillna(mn-1,inplace=True)
# test if column can be converted to an integer
asint = df[col].fillna(0).astype(np.int64)
result = (df[col] - asint)
result = result.sum()
if result > -0.01 and result < 0.01:
IsInt = True
# Make Integer/unsigned Integer datatypes
if IsInt:
if mn >= 0:
if mx < 255:
df[col] = df[col].astype(np.uint8)
elif mx < 65535:
df[col] = df[col].astype(np.uint16)
elif mx < 4294967295:
df[col] = df[col].astype(np.uint32)
else:
df[col] = df[col].astype(np.uint64)
else:
if mn > np.iinfo(np.int8).min and mx < np.iinfo(np.int8).max:
df[col] = df[col].astype(np.int8)
elif mn > np.iinfo(np.int16).min and mx < np.iinfo(np.int16).max:
df[col] = df[col].astype(np.int16)
elif mn > np.iinfo(np.int32).min and mx < np.iinfo(np.int32).max:
df[col] = df[col].astype(np.int32)
elif mn > np.iinfo(np.int64).min and mx < np.iinfo(np.int64).max:
df[col] = df[col].astype(np.int64)
# Make float datatypes 32 bit
else:
df[col] = df[col].astype(np.float32)
# Print new column type
print("dtype after: ",df[col].dtype)
print("******************************")
# Print final result
print("___MEMORY USAGE AFTER COMPLETION:___")
mem_usg = df.memory_usage().sum() / 1024**2
print("Memory usage is: ",mem_usg," MB")
print("This is ",100*mem_usg/start_mem_usg,"% of the initial size")
return df, NAlist
- 减少训练集使用的内存
train, NAlist = reduce_mem_usage(train)
print("_________________")
print("")
print("Warning: the following columns have missing values filled with 'df['column_name'].min() -1': ")
print("_________________")
print("")
print(NAlist)
Memory usage of properties dataframe is : 308.2276153564453 MB
MEMORY USAGE AFTER COMPLETION:
Memory usage is: 154.30458068847656 MB
This is 50.06189354903625 % of the initial size
- 减少检验集使用的内存
test, NAlist = reduce_mem_usage(test)
print("_________________")
print("")
print("Warning: the following columns have missing values filled with 'df['column_name'].min() -1': ")
print("_________________")
print("")
print(NAlist)
数据集域
print(train.columns)
print(len(train.columns))
202
print(train.info())
print(train.describe())
可视化
直方图
目标变量target是0-1型二值变量,我们画出它的频数直方图和饼图。
f,ax=plt.subplots(1,2,figsize=(18,8))
train['target'].value_counts().plot.pie(explode=[0,0.1],autopct='%1.1f%%',ax=ax[0],shadow=True)
ax[0].set_title('target')
ax[0].set_ylabel('')
sns.countplot('target',data=train,ax=ax[1])
ax[1].set_title('target')
plt.show()
我们发现,target的数据是不平衡的,即,0值占绝大多数(90%).
未完待续