目录
离散特征的编码分为2种情况:
1.我们在进行那些有大小关系的变量离散,小雨,中雨,大雨,
{“小雨”:1,“中雨”:2,“雨天”:3},这里面有一定数量的大小关系,这种映射的讲解在法1:标签的处理
2.只是换个名字的标签处理晴天,阴天,雨天这种标签没有大小的关系,那就考虑one-hot编码,或者说产生哑变量。
连续变量的离散化处理
比如说,分数,需要将数据划分为“0到60”,“61到79”,“79到100”几个分数组。用的是pd.cut(data,bins),这里的data是我们要分割的分数数据,bins是[0,60,79,100]。类似函数可学习pd.qcut
import pandas as pd
df = pd.DataFrame({"key":['green','red', 'blue'],
"data1":['a','b','c'],"sorce": [33,61,99]})
bins=[0,61,80,100]
cats=pd.cut(df["sorce"],bins)
print(cats)
group_name=["不及格","及格","优秀"]
cats2=pd.cut(df["sorce"],bins,labels=group_name,right=False)
#df["sorce"]为数据
#bins指定划分
#right指定区间闭合方向
#labels指定切分结果的标签
print(cats2)
############结果
0 (0, 61]
1 (0, 61]
2 (80, 100]
Name: sorce, dtype: category
Categories (3, object): [(0, 61] < (61, 80] < (80, 100]]
0 不及格
1 及格
2 优秀
Name: sorce, dtype: category
Categories (3, object): [不及格 < 及格 < 优秀]
那我们可以设计0-60分的需要编码为1,61-79为合格,80-100为优秀,这个和上面的第一条类似,只是需要一个数据划分的步骤,详见法2的相关处理。
pd.cut(data,4,precision=2) ,根据最大值与最小值计算等长面元长度。将数据分成4组(无法使各个面元中含有相同数量的数据点)精确度2位小数。
pd.qcut(data,[0,0.1,0.5,0.9,1]),根据样本分位数bins对数据进行面元划分,设置的是自定义分位数,0到1之间的数值,包含端点
法1.标签的处理:
#建立对应关系
label2current_service = dict(zip(range(0, len(set(df['current_service']))), sorted(list(set(df['current_service'])))))
current_service2label = dict(zip(sorted(list(set(df['current_service']))), range(0, len(set(df['current_service'])))))
# 原始数据的标签映射
df['current_service'] = df['current_service'].map(current_service2label)
#df['current_service']是一列代表类别的数据,上面是重新编码
from sklearn import svm
clf = svm.SVC(decision_function_shape='ovr')
clf.fit(X_trainData, df['current_service'])
y_test_predi