金融风控数据挖掘-Task3

一、学习知识点概要

学会利用sklearn,pandas,numpy等库对数据进行特征处理以及学习特征交互、编码、选择的相应方法。

二、学习内容

1、导入数据处理及可视化过程需要的库

# 导入可能需要用到的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import datetime
from tqdm import tqdm
from sklearn.preprocessing import LabelEncoder
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from sklearn.preprocessing import MinMaxScaler
import xgboost as xgb
import lightgbm as lgb
from catboost import CatBoostRegressor
import warnings
from sklearn.model_selection import StratifiedKFold, KFold
from sklearn.metrics import accuracy_score, f1_score, roc_auc_score, log_loss
warnings.filterwarnings('ignore')

2、特征值预处理

data_train=pd.read_csv("train.csv")
data_test_A=pd.read_csv("testA.csv")
# 处理EDA阶段分析出来的问题
# 查找数据中的对象特征和数据特征
numerical_fea = list(data_train.select_dtypes(exclude=['object']).columns)
category_fea = list(filter(lambda x: x not in numerical_fea,list(data_train.columns)))
label = 'isDefault'
numerical_fea.remove(label)``

```python
# 查看缺失值情况
data_train.isnull().sum()
# 缺失值处理
# pandas fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)
# value:用于填充的空值的值。
# method:ffill前,bfill后。
# axis:轴。0或'index',表示按行删除;1或'columns',表示按列删除。
# inplace:是否原地替换。布尔值,默认为False。如果为True,则在原DataFrame上进行操作,返回值为None。
# limit:int, default None。如果method被指定,对于连续的空值,这段连续区域,最多填充前 limit 个空值(如果存在多段连续区域,每段最多填充前 limit 个空值)。如果method未被指定, 在该axis下,最多填充前 limit 个空值(不论空值连续区间是否间断)
# downcast:dict, default is None,字典中的项为,为类型向下转换规则。或者为字符串“infer”,此时会在合适的等价类型之间进行向下转换,比如float64 to int64 if possible。
# data_train=data_train.fillna(0)
# 用缺失值上面的值替换缺失值 
# data_train=data_train.fillna(axis=0,method='ffill')
# 纵向用缺失值下面的值替换缺失值,且设置最多只填充两个连续的缺失值
# data_train=data_train.fillna(axis=0,method='bfill',limiat=2)
# 按照median填充数值型特征
data_train[numerical_fea] = data_train[numerical_fea].fillna(data_train[numerical_fea].median())
data_test_A[numerical_fea] = data_test_A[numerical_fea].fillna(data_train[numerical_fea].median())
# 按照众数类别型特征
data_train[category_fea]=data_train[category_fea].fillna(data_train[category_fea].mode())
data_test_A[category_fea]=data_test_A[category_fea].fillna(data_test_A[category_fea].mode())
# 对象型类类别特征预处理,'issueDate'为时间格式特征
# 转化为时间格式
for data in[data_train,data_test_A]:
    data['issueDate']=pd.to_datetime(data['issueDate'],format='%Y-%m-%d')
    startdate=datetime.datetime.strptime('2007-06-01','%Y-%m-%d')
    #构造时间特征
    data['issueDateDT']=data['issueDate'].apply(lambda x:x-startdate).dt.days
# value_counts()是一种查看表格某列中有多少个不同值的快捷方法,并计算每个不同值有在该列中有多少重复值。
# dropna = False 表示保留 nan,默认情况下 dropna 是true,即默认情况下不包含 nan
# sort_index()根据条件对数据集进行排序
data_train['employmentLength'].value_counts(dropna=False).sort_index()
def employmentLength_to_int(s):
    if pd.isnull(s):
        return s
    else:
        return np.int8(s.split()[0])
for data in [data_train, data_test_A]:
    data['employmentLength'].replace(to_replace='10+ years', value='10 years', inplace=True)
    data['employmentLength'].replace('< 1 year', '0 years', inplace=True)
    data['employmentLength'] = data['employmentLength'].apply(employmentLength_to_int)
# 对earliesCreditLine进行预处理
data_train['earliesCreditLine'].sample(5)
for data in [data_train, data_test_A]:
    data['earliesCreditLine'] = data['earliesCreditLine'].apply(lambda s: int(s[-4:]))
# 类别特征处理
# 部分类别特征
cate_features = ['grade', 'subGrade', 'employmentTitle', 'homeOwnership', 'verificationStatus', 'purpose', 'postCode', 'regionCode', \
                 'applicationType', 'initialListStatus', 'title', 'policyCode']
for f in cate_features:
    print(f, '类型数:', data[f].nunique())
# 对等级进行自映射
for data in [data_train,data_test_A]:
    data['grade']=data['grade'].map({'A':1,'B':2,'C':3,'D':4,'E':5,'F':6,'G':7})
# 类型数在2之上,又不是高维稀疏的,且纯分类特征
# get dummies是利用pandas实现one hot encode的方式
# pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False)[source]
for data in [data_train, data_test_A]:
    data = pd.get_dummies(data, columns=['subGrade', 'homeOwnership', 'verificationStatus', 'purpose', 'regionCode'], drop_first=True)

3、异常值处理

# 检测异常的方法一:均方差
def find_outliers_by_3segama(data,fea):
    data_std=np.std(data[fea])
    data_mean=np.mean(data[fea])
    outliers_cut_off=data_std*3
    lower_rule=data_mean-outliers_cut_off
    upper_rule=data_mean+outliers_cut_off
    data[fea+'_outliers']=data[fea].apply(lambda x:str('异常值') if x > upper_rule or x < lower_rule else '正常值')
    return data
# 得到特征的异常值后可以进一步分析变量异常值和目标变量的关系
data_train = data_train.copy()
for fea in numerical_fea:
    data_train = find_outliers_by_3segama(data_train,fea)
    print(data_train[fea+'_outliers'].value_counts())
    print(data_train.groupby(fea+'_outliers')['isDefault'].sum())
    print('*'*10)
#删除异常值
for fea in numerical_fea:
    data_train = data_train[data_train[fea+'_outliers']=='正常值']
    data_train = data_train.reset_index(drop=True) 

4、数据分桶

# 固定宽度分箱
# 通过除法映射到间隔均匀的分箱中,每个分箱的取值范围都是loanAmnt/1000
data['loanAmnt_bin1'] = np.floor_divide(data['loanAmnt'], 1000)
## 通过对数函数映射到指数宽度分箱
data['loanAmnt_bin2'] = np.floor(np.log10(data['loanAmnt']))
# 分位数分箱
data['loanAmnt_bin3'] = pd.qcut(data['loanAmnt'], 10, labels=False)

5、特征交互

for col in ['grade', 'subGrade']: 
    temp_dict = data_train.groupby([col])['isDefault'].agg(['mean']).reset_index().rename(columns={'mean': col + '_target_mean'})
    temp_dict.index = temp_dict[col].values
    temp_dict = temp_dict[col + '_target_mean'].to_dict()

    data_train[col + '_target_mean'] = data_train[col].map(temp_dict)
    data_test_A[col + '_target_mean'] = data_test_A[col].map(temp_dict)

6、特征编码

# label直接放入树模型中
for col in tqdm(['employmentTitle', 'postCode', 'title','subGrade']):
    le = LabelEncoder()
    le.fit(list(data_train[col].astype(str).values) + list(data_test_A[col].astype(str).values))
    data_train[col] = le.transform(list(data_train[col].astype(str).values))
    data_test_A[col] = le.transform(list(data_test_A[col].astype(str).values))
print('Label Encoding 完成')

7、特征选择

# 删除不需要的数据
for data in [data_train,data_test_A]:
    data.drop(['issueDate'],axis=1,inplace=True)
# 纵向用缺失值上面的值替换缺失值
data_train=data_train.fillna(axis=0,method='ffill')
x_train=data_train
# 计算协方差 看相关性,进行模型训练
data_corr=x_train.corrwith(data_train.isDefault) #计算相关性
result=pd.DataFrame(columns=['features','corr'])
result['features']=data_corr.index
result['corr']=data_corr.values
# 直接看图
data_numeric=data_train[numerical_fea]
correlation=data_numeric.corr()
f,ax=plt.subplots(figsize=(7,7))
plt.title('Correlation of Numeric Features with Price',y=1,size=16)
sns.heatmap(correlation,square = True,  vmax=0.8)

三、学习问题与解答

1、关于特征处理和特征选择

特征工程(Feature Engineering)经常被说为机器学习中的black art,这里面包含了很多不可言说的方面。怎样处理好特征,最重要的是对需要解决问题的了解。但是,它其实也有很多科学的地方。
特征处理(Feature Processing)

2、关于one hot编码

One-Hot编码是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值。然后,每个整数值被表示为二进制向量,除了整数的索引之外,它都是零值,它被标记为1。
python 中one—hot 三种编码方式

四、学习思考与总结

数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。特征过程是机器学习乃至深度学习中极为重要的过程,此次task3的完成耗费许多精力,明显的感受是sklearn在特征过程中的重要地位,其包括数据预处理,特征选择,降维等,也是学习python以来第一次使用sklearn,也深深被其丰富且方便的算法模型库所吸引。在熟悉sklearn的用法后,其较为完整的特征处理方法将会使特征工程方便许多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值