特征工程
特征工程
为什么需要特征工程
1、缺失值、重复值、异常值的清洗,样本更纯净
2、将非数字特征,转换为数字特征
3、特征工程分为三部分:特征抽取,数据特征的预处理,特征选择
特征抽取
非数字特征,转换为数字特征
- 无序分类变量
- 有序分类变量
属性编码
#先引入DictVectorizer包。
from sklearn.feature_extraction import DictVectorizer
alist = [
{'city':'BeiJing','temp':33},
{'city':'GZ','temp':42},
{'city':'SH','temp':40}
]
#实例化一个d为DictVectorizer,然后sparse为True意思是返回字典,False返回矩阵
d = DictVectorizer(sparse=True)
result = d.fit_transform(alist)
print(result)
独热码
import pandas as pd
df = pd.DataFrame([
['green', 'M', 20, 'class1'],
['red', 'L', 21, 'class2'],
['blue', 'XL',30, 'class3']])
df.columns = ['color', 'size', 'weight', 'class label']
#独热码编码get_dummies
one_hot_color = pd.get_dummies(df['color'])
#先横向连接独热码,然后再删除color那一列
pd.concat((df,one_hot_color),axis=1).drop(labels='color',axis=1)
英文分词,编码:
from sklearn.feature_extraction.text import CountVectorizer
c = CountVectorizer()
alist = [
'left is is short,i love python',
'left is too long,i hate python'
]
result = c.fit_transform(alist)
#输出特征名
print(c.get_feature_names())
#对应的特征名的数量作为一个向量,充当特征
print(result.toarray())
中文分词:
调用jieba包,进行中文分词。
jieba.cut 注意text是字符串,不是列表,不是元组,然后记得转list
import jieba
text = '人生苦短,我用Python,人生漫长,不用Python'
result = list(jieba.cut(text))
print(result)
c = CountVectorizer()
data1 = '在机器学习算法实践中,我们往往有着将不同规格的数据转换到同一规格'
data2 = '特征抽取后我们就可以获取对应的数值型的样本数据啦,然后就可以进行数据处理了'
r1 = list(jieba.cut(data1))
r2 = list(jieba.cut(data2))
s_r1 = ' '.join(r1)
s_r2 = ' '.join(r2)
all_data = [s_r1,s_r2]
result = c.fit_transform(all_data)
print(c.get_feature_names())
print(result.toarray())
特征的预处理
归一化
x1 = 最大值 - 最小值 ÷ 插值
x2 = x1 * (最大值-最小值) + 最小值
from sklearn.preprocessing import MinMaxScaler
x = [[1000,10,1],
[2000,11,2],
[4000,100,20]]
mm = MinMaxScaler()
result = mm.fit_transform(x)
print(result)
#最后输出
# [[0. 0. 0. ]
# [0.33333333 0.01111111 0.05263158]
# [1. 1. 1. ]]
标准化
x1 = (x - 平均值)÷ 方差
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
x = [[1000,10,1],
[2000,11,2],
[4000,100,20]]
result = ss.fit_transform(x)
print(result)
# [[-1.06904497 -0.71892408 -0.76360355]
# [-0.26726124 -0.69522328 -0.64906302]
# [ 1.33630621 1.41414736 1.41266656]]
特征选择
Filter过滤式(方差过滤)
把方差小于多少的某列特征直接筛掉 threshold
import numpy as np
x = np.random.randint(10,50,size=(5,6))
midian = np.median(x.var(axis=0)) #对于每一列都求了一个方差,然后求方差的中位数
v = VarianceThreshold(threshold=midian) #把中位数作为threshold,筛掉小于多少的某列特征
result = v.fit_transform(x)
print(result)
PCA降维(主成分分析)
是一种分析,简化数据集的技术,也是【矩阵分解算法】的核心算法
from sklearn.decomposition import PCA
#将数据分解为较低维度的空间
#n_components可以为小数(保留特征的百分比),整数(减少到的特征数量)
pca = PCA(n_components=3)
pca.fit_transform([[0,2,4,3],[0,3,7,3],[0,9,6,3]])

浙公网安备 33010602011771号