特征提取之pd.get_dummies()


import os

os.makedirs(os.path.join('..','data'),exist_ok=True)
data_file=os.path.join('..','data','house_tiny.csv')
with open(data_file,'w') as f:
    f.write('NumRooms,Alley,Prices\n')#列名
    f.write('NA,Pave,127500\n')#每行一个数据版本;在向文件里写入NA的时候要注意字符之间不要用空格,
    #否则写入的是NA这个字符而不是NaNl类型的missing value;
    f.write('2,NA,106000\n')
    f.write('4,NA,178100\n')
    f.write('NA,NA,140000\n')
#从创建的CSV文件中读取文件内容出来/加载原始数据集
with open(data_file,'r') as f:
    for line in f:
        print(line)

#输出:
NumRooms,Alley,Prices

NA,Pave,127500

2,NA,106000

4,NA,178100

NA,NA,140000
#从创建的CSV文件中读取文件内容出来/加载原始数据集
#如果没有安装pandas,只需取消对以下行的注释;
# !pip install pandas
import pandas as pd

data=pd.read_csv(data_file)
print(data)
data#在jupyter中如果不用print,直接用要输出的变量名,则jupyter默认会用html形式输出,会好看一点;

 输出:

'''未处理缺失的数据,典型的方法包括插值、删除,我们这里考虑插值'''
inputs,outputs=data.iloc[:,0:2],data.iloc[:,2]
inputs=inputs.fillna(inputs.mean())
print(inputs)

#输出:
   NumRooms Alley
0       3.0  Pave
1       2.0   NaN
2       4.0   NaN
3       3.0   NaN
"""对于inputs中的类别值或离散值,我们讲NaN视为一个类别"""
inputs=pd.get_dummies(inputs,dummy_na=True)
print(inputs)

输出:
   NumRooms  Alley_Pave  Alley_nan
0       3.0           1          0
1       2.0           0          1
2       4.0           0          1
3       3.0           0          1

  

"""现在inputs和outputs中的所有条目都死数值类型,它们可以转换为张量格式"""
import torch
X,y=torch.tensor(inputs.values),torch.tensor(outputs.values)
X,y

#输出:
(tensor([[3., 1., 0.],
         [2., 0., 1.],
         [4., 0., 1.],
         [3., 0., 1.]], dtype=torch.float64),
 tensor([127500, 106000, 178100, 140000]))
import pandas as pd
import numpy as np
s = pd.Series(list('abca'))
pd.get_dummies(s)

#输出:
import pandas as pd
df = pd.DataFrame([  
            ['green' , 'A'],   
            ['red'   , 'B'],   
            ['blue'  , 'A']])  


df.columns = ['color',  'class']
pd.get_dummies(df)

get_dummies 是利用pandas实现one hot encode的方式。详细参数请查看官方文档
使用:

一种字符型或者其他类型编程成一串数字向量,是实现独热编码的方式;

pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False)[source]

注意:get_dummies只会将字段类型是object的列独热编码,数据型的不独热编码

参数说明:

data:需要进行独热编码的数据,包括array,array-like, series, df[col], DataFrame 输入的数据等等;

prefix:前缀,可以理解为独热编码后生成的列名的前缀;string, list of strings, or dict of strings, default None。get_dummies转换后,列名的前缀;

prefix_sep:分隔符,可以理解为独热编码后生成的列名的分隔符

dummy_na:如果忽略False NaNs,则添加一列来指示NaNs; bool, default False,增加一列表示空缺值,如果False就忽略空缺值; 

columns:list-like, default None。指定需要实现类别转换的列名; 要编码的DataFrame中的列名称。 如果列为None,则将转换具有object或category dtype的所有列;

sparse:是否应该使用SparseArray (True)或常规NumPy数组(False)来支持用dummy编码的列

drop_first:是否通过移除第一个级别来将k-1假人从k个类别级别中取出; bool, default False,获得k中的k-1个类别值,去除第一个。

df=pd.DataFrame(['green','blue','red','blue','green'],columns=['color'])

df,pd.get_dummies(df),pd.get_dummies(df,prefix ='cl'),pd.get_dummies(df,prefix ='cl',prefix_sep = '/'),df

#输出:
(   color
 0  green
 1   blue
 2    red
 3   blue
 4  green,
    color_blue  color_green  color_red
 0           0            1          0
 1           1            0          0
 2           0            0          1
 3           1            0          0
 4           0            1          0,
    cl_blue  cl_green  cl_red
 0        0         1       0
 1        1         0       0
 2        0         0       1
 3        1         0       0
 4        0         1       0,
    cl/blue  cl/green  cl/red
 0        0         1       0
 1        1         0       0
 2        0         0       1
 3        1         0       0
 4        0         1       0,
    color
 0  green
 1   blue
 2    red
 3   blue
 4  green)

离散特征的编码分为两种情况:
1、离散特征的取值之间没有大小的意义,比如color:[red,blue],那么就使用one-hot编码
2、离散特征的取值有大小的意义,比如size:[X,XL,XXL],那么就使用数值的映射{X:1,XL:2,XXL:3}

 

相关