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