2021-04-28

一.学习知识点概括

本章学习了特征预处理、缺失值、异常值处理、数据分桶等特征处理方法,还有特征交互、编码、选择的相应方法。通过代码的学习和运行,了解各种特征工程以及分析方法。

二.学习内容

1.导入包并读取数据

# 需要提前安装的包
!pip install catboost --user

导入的包如下:

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')
data_train =pd.read_csv('train.csv')
data_test_a = pd.read_csv('testA.csv')

2.特征预处理

数据预处理部分一般我们要处理一些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)

数据预处理是很重要的!!缺失值的填充很大因素会影响最后的结果,因此在比赛中不妨尝试多种填充然后比较结果选择结果最优的一种。

*缺失值填充
把所有缺失值替换为指定的值0
data_train = data_train.fillna(0)
向用缺失值上面的值替换缺失值
data_train = data_train.fillna(axis=0,method=‘ffill’)
纵向用缺失值下面的值替换缺失值,且设置最多只填充两个连续的缺失值
data_train = data_train.fillna(axis=0,method=‘bfill’,limit=2)

#查看缺失值情况
data_train.isnull().sum()
#按照平均数填充数值型特征
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_train[category_fea].mode())
data_train.isnull().sum()

在这里插入图片描述
在这里插入图片描述
category_fea:对象型类别特征需要进行预处理,其中[‘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

很多时候时间日期等较难处理,需要我们转化为数据进行统一,这样我们将数据预处理之后会更加方便我们后面的进程,也方便后面的数据分析。

结果如下:
在这里插入图片描述

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)
data['employmentLength'].value_counts(dropna=False).sort_index()

*类别特征处理

# 部分类别特征
cate_features = ['grade', 'subGrade', 'employmentTitle', 'homeOwnership', 'verificationStatus', 'purpose', 'postCode', 'regionCode', \
                 'applicationType', 'initialListStatus', 'title', 'policyCode']
for f in cate_features:
    print(f, '类型数:', data[f].nunique())

每种数据都有不一样的类别,我们可以通过预处理,将所有数据的类型数整理出来,方便后面的数据分析。

三.学习问题与解答

交互特征那方面我还不是很熟悉,这次的学习让我了解更多的是如何处理特征值。因为时间原因,有很多的知识没有学完,其中上面学的那些也不是很巩固。因此,我搜集了很多的资料,将上面学过的内容补充了一下。

四.学习思考和总结

最近的时间比较紧张,所以学习起来有些费劲,加上每次学习的时间限制在三天内,导致我很多时候都没有足够的时间学习完所有的内容,加上在这上面耗费的时间其实也挺多的,但是感觉学到的也只是皮毛,所以,以后的学习我会更加认真,尽量做到事倍功半。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值