贷款逾期(5)--特征处理

任务描述

关于数据类型转换以及缺失值处理(尝试不同的填充看效果)以及你能借鉴的数据探索

遇到的问题

SVM模型训练时一直卡住不动,【原因是数据没有标准化或者是归一化】

特征处理

1删除无用变量

无用变量比如一个类只有唯一属性(人类只用男性),若加入模型训练且对最终模型生效的话,很可能就是出现了过拟合

data.drop(['id_name', 'custid', 'trade_no', 'bank_card_no'], axis=1, inplace=True)

或者对每一列的数据进行统计,如果这一列的数据每一个都不同,即判断为无关特征并且删去。

for i in data.columns:
    count = data[i].count()
    if len(list(data[i].unique())) in [1,count,count-1]:
        data.drop(i,axis = 1,inplace=True )

2特征类型划分

数值型特征

取出数值型特征,观察缺失及分布情况

# 取出数值型变量
X_num = X.select_dtypes('number').copy()
print(X_num)
X_num.shape
# 查看缺失情况
num_miss= X_num.count()
print(num_miss)
#查看缺失率
num_miss_rate = 1-X_num.count()/len(X_num)
print(num_miss_rate)
#缺失率前十
num_miss_rate.sort_values(ascending=False, inplace=True)
print(num_miss_rate[:10])

缺失值处理

(1)填充固定值

选取某个固定值/默认值填充缺失值。

data.fillna(0,inplace=True)

(2)填充均值

对每一列的缺失值,填充当列的均值

data.fillna(data.mean(),inplace=True)

(3)填充中位数

对每一列的缺失值,填充当列的中位数。

data.fillna(data.median(),inplace=True)

(4)填充众数

对每一列的缺失值,填充当列的众数。由于存在某列缺失值过多,众数为nan的情况,因此这里取的是每列删除掉nan值后的众数。

data.fillna(data.mode(),inplace=True) # 填充众数,该数据缺失太多众数出现为nan的情况
features_mode = {}
for f in features:
    print f,':', list(data[f].dropna().mode().values)
    features_mode[f] = list(data[f].dropna().mode().values)[0]
data.fillna(features_mode,inplace=True)

(5)填充上下条的数据

对每一条数据的缺失值,填充其上下条数据的值。

data.fillna(method='pad', inplace=True) # 填充前一条数据的值,但是前一条也不一定有值
data.fillna(0, inplace=True)
 
data.fillna(method='bfill', inplace=True) # 填充后一条数据的值,但是后一条也不一定有值
data.fillna(0, inplace=True)

(6)填充插值得到的数据

用插值法拟合出缺失的数据,然后进行填充。

for f in features: # 插值法填充
    data[f] = data[f].interpolate()
    
data.dropna(inplace=True)

字符型特征

reg_preference_for_trad表示城市类型,仅有两个缺失,用众数填充后分别使用 哑变量 或 编码 的形式进行数据装换

# 众数填充
data['reg_preference_for_trad'] = data['reg_preference_for_trad'].fillna(data['reg_preference_for_trad'].mode()[0])

# 哑变量
data_dummy = pd.get_dummies(data['reg_preference_for_trad'])
# 数字编码
data_map = data['reg_preference_for_trad'].map({'一线城市': 0, '二线城市': 1,'三线城市': 2,  '其他城市': 3, '境外': 4})
#数字转码
n=set(data['reg_preference_for_trad'])
dic={}
for i,j in enumerate(n):
    dic[j]=i
data['reg_preference_for_trad'] = data['reg_preference_for_trad'].map(dic)

2数据类型

数据归一化

from sklearn import preprocessing
min_max_scale = preprocessing.MinMaxScaler()
min_max_data = min_max_scale.fit_transform(data)

数据标准化

from sklearn import preprocessing
zdata = preprocessing.scale(data)

猜你喜欢

转载自blog.csdn.net/lgy54321/article/details/84330070