利用pandas库中的get_dummies函数对类别型特征进行哑变量处理。
get_dummies语法:
pandas.get_dummies(data,prefix=None,prefix_sep='_',dummy_na=False,columns=None,sparse=False,drop_first=False)
对类别型特征进行哑变量处理主要解决了部分算法模型无法处理类别性数据的问题,在一定程度上起到了扩充特征的作用
哑变量处理前:
import pandas as pd
city_data=pd.DataFrame({"城市":["广州","上海","杭州","北京","深圳","杭州","上海"]})
print(city_data)
cdummies_data=pd.get_dummies(city_data) #哑变量处理
print(cdummies_data)
pandas提供了cut函数,完成连续性数据的等宽离散化。
cut基础语法:
pandas.cut(x,bins,right,labels=None)
age_data=pd.DataFrame({"年龄":[14,16,18,19,23,34,67,87]})
print(age_data)
agec_data=pd.cut(age_data.iloc[:,0],3)
#pandas中的value_counts函数,帮助我们自动统计某一列不同类别出现的次数,而且自动进行排序
print("离散化后的年龄分布为:\n",agec_data.value_counts())
结果:
离散化后的年龄分布为:
(13.927, 38.333] 6
(62.667, 87.0] 2
(38.333, 62.667] 0
Name: 年龄, dtype: int64
等宽法缺陷:等宽法离散化对数据分布具有较高的要求,若数据分布不均匀,那么各类别的数目会变得非常不均匀,会严重损坏所建立的模型
等频法避免了分布不均匀的问题,但可能将数值接近的两个值分配到不同的区间以满足每个区间对个数的要求
cut虽然不能直接实现等频离散化,但可以通过定义函数将相同数量的记录放进每个区间
import pandas as pd
import numpy as np
age_data=pd.DataFrame({"年龄":[14,16,18,19,23,34,67,87]})
def SameRateCut(data,k):
w=data.quantile(np.arange(0,1+1.0/k,1.0/k))
data=pd.cut(data,w)
return data
#对年龄数据进行离散化
result=SameRateCut(age_data.iloc[:,0],3).value_counts()
print('对年龄进行等频离散化后各类别数目分布状况为:\n',result)
注意:进行离散化处理的数据必须是一维,否则会报错。
结果:
对年龄进行等频离散化后各类别数目分布状况为:
(30.333, 87.0] 3
(18.333, 30.333] 2
(14.0, 18.333] 2
Name: 年龄, dtype: int64
一维聚类步骤:首先将连续性数据用聚类算法(K-Means算法等)进行聚类,然后处理聚类得到的簇,为合并到一个簇的连续型数据做同一种标记
聚类分析的离散化方法需要用户指定簇的个数,用来决定产生的区间数
理解即可:
import pandas as pd
def KmeanCut(data,k):
from sklearn.cluster import KMeans
#建立模型 n_jobs
kmodel=KMeans(n_clusters=k,n_jobs=4)
kmodel.fit(data.reshape((len(data),1)))#训练模型
#输出聚类中心并排序
c=pd.DataFrame(kmodel.cluster_centers_).sort_values(0)
w=pd.rolling_mean(c,2).iloc[1:]#相邻两项求中点,作为边界点
w=[0]+list(w[0])+[data.max()] #把首末边界点加上
data=pd.cut(data,w)
return data