机器学习Machine Learning & Data Analysis特征工程

特征工程(一)概念及python的实现手段

2018-08-10  本文已影响3人  在做算法的巨巨

最近两天心情很忐忑,文章更新晚了点,想了想,继续努力吧。



以上就是我对特征工程的理解,接下来,说说具体python的实现手段。我会用两种方法实现,一种是自定义函数实现,一种调用python preprocessing包。

举例使用的数据是


  1. 缺失值剔除

python实现

data.dropna() #高级语言,高级实现

函数实现

def findinx(data):
    if len(data)==1:
        if  pd.isnull(data['豆瓣评分'][0]):
            data.drop([0])
    else:
        index=[]
        for i in range(len(data)):
            if pd.isnull(data['豆瓣评分'][i]) or pd.isnull(data['累计票房'][i]) or pd.isnull(data['电影名称'][i]):
                index.append(i)
    data.drop(index)
    return(data)  

处理结果


  1. 缺失值填充(填充可以填充均值/中位数/众数)

python实现

from sklearn.preprocessing import Imputer
imputer=Imputer(strategy='mean') #mean, median, most_frequent
data['累计票房']=imputer.fit_transform(data[['累计票房']])
data['豆瓣评分']=imputer.fit_transform(data[['豆瓣评分']])

函数实现

def findinx(data):
    if len(data)==1:
        if data['豆瓣评分'][0]==np.nan:
            data.drop([0])
    else:
        index=[]
        for i in range(len(data)):
            if pd.isnull(data['豆瓣评分'][i]):
                data['豆瓣评分'][i]=np.mean(data['豆瓣评分'])
            if pd.isnull(data['累计票房'][i]):
                data['累计票房'][i]==np.mean(data['累计票房'])
    return(data)    

处理结果


举例使用的数据


在上面的数据中我们发现,累计票房和豆瓣评分的数据跨度相差很大,如果我们不做量纲的转化,会导致我们模型很容易“扁长化”。


0-1标准化

python实现

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
data['标准累计票房'] = scaler.fit_transform(data[['累计票房']])
data['标准豆瓣评分']=scaler.fit_transform(data[['豆瓣评分']])

函数实现

def minmaxscaler1(data,columns):
    #columns=['累计票房','豆瓣评分']
    for column in columns:
        data['标准化'+column]=(data[column]-np.min(data[column]))/(np.max(data[column])-np.min(data[column]))
    return(data)

Z标准化

python实现

from sklearn.preprocessing import scale
data3['标准累计票房'] = scaler.fit_transform(data3[['累计票房']])
data3['标准豆瓣评分'] = scaler.fit_transform(data3[['豆瓣评分']])

函数实现

def zscale(data,columns):
    #columns=['累计票房','豆瓣评分']
    for column in columns:
        data['标准化'+ column]=(data[column]-np.mean(data[column]))/np.std(data[column])
    return(data)

Normalizer归一化

Normalizer一半用于TF-IDF的矩阵中

from sklearn.preprocessing import Normalizer
scaler=Normalizer(norm='l1') # l1, l2
data['标准累计票房']=scaler.fit_transform(data[['累计票房']].transpose()).transpose()
data['标准豆瓣评分']=scaler.fit_transform(data[['豆瓣评分']].transpose()).transpose()

函数实现

def pl1(data):
    sumvalue=0
    for i in data:
        sumvalue=sumvalue+np.abs(i)
    data=data/sumvalue
    return(data)

def pl2(data):
    sumvalue=0
    for i in data:
        sumvalue=sumvalue+i**2
    data=data/(np.sqrt(sumvalue))
    return(data)

def normalizer(data, columns, way):
    #way='l1' or 'l2'
    for column in columns:
        if way=='l1':
            data['归一化'+column]=pl1(data[column])
        elif way=='l2':
            data['归一化'+column]=pl2(data[column])    
    return(data)

可以看出我们函数计算的结果和调包计算的结果没有差别。

转虚拟变量一半用dict就可以实现,当然python有现成包。
我们举例的数据如下。


python实现

dummiesData=pd.get_dummies(data4, columns=['症状'], prefix=['症状'], prefix_sep="_")
dummiesData = pd.get_dummies(
data4,columns=['职业','疾病','症状'],prefix=['职业','疾病','症状'],prefix_sep="_"
)

python这种虚拟变量的做法容易增加数据特征的维度。

函数实现

def dummyvariable(names):
    dummies=np.linspace(1,len(names),len(names))
    return(dummies)

def dummy(data):
    newdata=pd.DataFrame()
    columns=data.columns
    feature={}
    for column in columns:
        feature[column] = data[column].unique()
        dummy={}
        dummies=dummyvariable(feature[column])
        for i in range(len(feature[column])):
            dummy[feature[column][i]]=dummies[i]
        newdata[column]=data[column].map(dummy)
    return(newdata)

可以看出,我们已经将文本的数据转化成了数值型数据。


接下来,会写到,特征的分析以及降维的一些问题。

上一篇 下一篇

猜你喜欢

热点阅读