1、如下图,“AGE”“EDUCATION”“MARRIAGE”“RISK”是非数值型特征,不可以直接训练模型,需要进行编码,把特征转换成数值型,然后进行训练。
2、有很多种编码方式,比如one-hot编码(独热编码),也可以映射有序特征,对于分类型特征,可以对类别进行编码。
下图用的就是对“AGE”“EDUCATION”“MARRIAGE”“RISK”映射有序特征。
col_dicts = {}
cols = ['SEX','EDUCATION','MARRIAGE','RISK']
col_dicts = {
'SEX': {
'Female': 0,
'Male': 1
},
'EDUCATION': {
'High School': 1,
'University': 2,
'Graduate School': 3,
'Others': 0
},
'MARRIAGE': {
'Single': 1,
'Married': 2,
'Others': 0
},
'RISK': {
'HIGH': 0,
'LOW': 1
}
}
for col in cols:
credit[col] = credit[col].map(col_dicts[col])
credit.head(10)
3、one-hot编码
# One-Hot编码方法二:使用`pandas`的`get_dummies`函数实现
var = ["SEX", "EDUCATION", "MARRIAGE","RISK"]
multi_dummies = [] # 存储三个 DataFrame
credit_dummies = credit[["AGE","BILL_1","BILL_2","BILL_3","BILL_4","BILL_5","BILL_6"]]
for col in var:
dummies = pd.get_dummies(credit[col], prefix = col)
credit_dummies = pd.concat([credit_dummies,dummies],axis=1) # 将编码结果与非编码特征水平拼接起来
credit_dummies.head()
总结:现在来了一批特征 color price size classlabel 。其中有非数值型特征,接下来我们该怎样处理呢?
(一)size 特征M L XL 这三个值是有大小差别的,编码后最后能够反映出大小关系,还有特征反应顺序关系的,比如小学,、初中、高中。最好用映射有序特征方法编码。
(二)classlabel标签是属于类别标签,我们可以对类别进行编码,和映射有序特征差不多。
(三)对于color特征,颜色值没有大小之分,我们可以用one-hot encoding编码方式进行编码。
不同的模型对于非数值特征的编码要求有所不同。
(参考:《python机器学习》 )