特征提取之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}