数据决定上限,模型逼近上限
类别特征
类别特征的特点:当类别基数较大时在处理后会产生非常稀疏的特征,难以处理缺失值。
onehot encoding
- onehot之前要去掉NAN值
输入数据格式:必须是二维的testdata[['pet']] (二维),数据大小假设为(n,3)
输出数据格式:toarray()之后自然转为array格式,每一行输出数据代表一条数据的encode结果
例子
from sklearn import preprocessing
enc = preprocessing.OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]]) # fit来学习编码
enc.transform([[0, 1, 3]]).toarray() # 进行编码
输出:array([[ 1., 0., 0., 1., 0., 0., 0., 0., 1.]])
数据矩阵是4*3,即4个数据,3个特征维度。
0 0 3 观察左边的数据矩阵,第一列为第一个特征维度,有两种取值0\1. 所以对应编码方式为10 、01
1 1 0 同理,第二列为第二个特征维度,有三种取值0\1\2,所以对应编码方式为100、010、001
0 2 1 同理,第三列为第三个特征维度,有四中取值0\1\2\3,所以对应编码方式为1000、0100、0010、0001
1 0 2
再来看要进行编码的参数[0 , 1, 3], 0作为第一个特征编码为10, 1作为第二个特征编码为010, 3作为第三个特征编码为0001. 故此编码结果为 1 0 0 1 0 0 0 0 1
注意:函数将输入数据的每一行看做一个样本进行onehot训练,所以transform时也是一行一个样本的进行编码,只是我们要保证fit和transform的数据列数要一致才可以正常编码
categorical_features:计数从0开始,[0]表示对第0列进行onehot编码,默认all
sparse:true返回矩阵格式 False返回numpy格式
handle_unkonwn:如果tranform时出现fit中不存在的值,无法进行编码时,error表示报错,ignore表示吧这种值设为全0
from sklearn.preprocessing import OneHotEncoder
onehot=OneHotEncoder(categorical_features = [1],sparse=False)
label encoding
- 对非线性树算法有用
- 不增加维度
输入数据格式:可以一维也可以二维,testdata['pet'](一维),数据大小为(n,)
输出数据格式:长度为n的list,每个元素表示每个输入数据的encode,非二值形式
注:在使用LabelEncoder之前要对数据进行缺失值处理,比如fillna("None),不然编码的时候会报错
a = LabelEncoder().fit_transform(testdata['pet'])
OneHotEncoder( sparse=False ).fit_transform(a.reshape(-1,1)) # 注意: 这里把 a 用 reshape 转换成 2-D array
查看label encoding与onehot encoding的区别
testdata = pd.DataFrame({
'pet': ['cat', 'dog', 'dog', 'fish'],'age': [4 , 6, 3, 3],
'salary':[4, 5, 1, 1]})