机器学习——特征工程

机器学习——特征工程

  • 特征抽取
    • 字典特征
    • 文本特征
      • 统计次数(CountVectorizer)
      • TF-IDF
  • 特征的预处理
    • 归一化
    • 标准化
      • 缺失值处理

特征抽取

特征抽取:对文本等数据进行特征值化,特征抽取是为了计算机更好理解数据。

特征抽取的API:sklearn.feature_extraction

字典特征

作用:对字典数据进行特征化,把字典中一些类别数据,分别进行转换成特征。

  • 类:sklearn.feature_extraction.DictVectorizer
  • DictVectorizer(sparse=True,…)
    • DictVectorizer.fit_transform(X)
      • X: 字典或者包含字典的迭代器(所有的字典放在同意个列表里)
      • 返回值:返回sparse矩阵
    • DictVectorizer.inverse_transform(X)
      • X: array数组或者sparse矩阵
      • 返回值:转换之前数据格式
    • DictVectorizer.get_feature_names()
      • 返回类别名称
    • DictVectorizer.transform(X)
      • 按照原先的标准转换
from sklearn.feature_extraction import DictVectorizer

# 实例化DictVectorizer, sparse = False意味着返回格式不为sparse矩阵, 为ndarray类型
dict = DictVectorizer(sparse = False)

# 调用fit_transform转换
data = dict.fit_transform([{'city': '北京','temperature': 100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature': 30}])

# 打印出类别名称
print(dict.get_feature_names())
print(data)

# 输出结果
['city=上海', 'city=北京', 'city=深圳', 'temperature']
[[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]]

One-hot 编码
普通编码:

Sample Category Numerical
1 Human 1
2 Human 1
3 Penguin 2
4 Octopus 3
5 Alien 4
6 Octopus 3
7 Alien 4

这里利用1、2、3、4进行编码可能会存在优先级问题,One-hot编码解决了这个问题。
One-hot编码:

Sample Human Penguin Octopus Alien
1 1 0 0 0
2 1 0 0 0
3 0 1 0 0
4 0 0 1 0
5 0 0 0 1
6 0 0 1 0
7 0 0 0 1

文本特征

统计次数(CountVectorizer)

作用:对文本数据进行特征化,常用于文本分类,情感分析等。

  • 类:sklearn.feature_extraction.text.CountVectorizer
  • CountVectorizer()
    • 返回词频矩阵
    • CountVectorizer.fit_transform(X)
      • X: 文本或者包含文本字符串的可迭代对象
      • 返回值:返回sparse矩阵
    • CountVectorizer.inverse_transform(X)
      • X: array数组或者sparse矩阵
      • 返回值:转换之前数据格式
    • CountVectorizer.get_feature_names()
      • 返回值:单词列表

处理英文文本

from sklearn.feature_extraction.text import CountVectorizer

# 实例化CountVectorizer
cv = CountVectorizer()

# 调用fit_transform转换
data = cv.fit_transform(["life is short,I like python", "life is too long,I dislike python"])

# 打印出类别名称
print(dict.get_feature_names())  
print(data.toarray()) # 将sparse转换成ndarray

# 输出结果
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
[[0 1 1 1 0 1 1 0]
 [1 1 1 0 1 1 0 1]]

由结果可看成以下几点:

  • 统计出文章中出现的所有的词,重复的只看作一次
  • 对每篇文字,在此的列表里面进行统计每个词出现的次数
  • 单个字母(汉字)不统计(因为单个字母/汉字没有分类依据)。

处理中文文本

处理中文文本之前首先需要进行分词处理(利用jieba包)

# 分词处理
import jieba
content1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
content2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")

# 转换为列表
cont1 = list(c1)
cont2 = list(c2)

# 把列表转换成字符串
c1 = ' '.join(con1)
c2 = ' '.join(con2)
# 中文文本特征值化
cv = CountVectorizer()
data = cv.fit_transform([c1, c2])

print(cv.get_feature_names())
print(data.toarray())

TF-IDF

主要思想:若某个词或短语在一篇文章中出现概率高,且在其他文章中很少出现,则认为此词或短语具有更好的类别区分能力,适合用来分类
作用:用以评估一字词对于一个文件集或者一个语料库的其中一份文件的重要程度

  • tf: term frequency(词频)
  • idf: inverse document frequency(逆文档频率):log(总文档数量/该词出现的文档数量)
  • tf * idf: 重要性
  • TfidfVectorizer(stop_words=None,…)
    • 返回词的权重矩阵
    • TfidfVectorizer.fit_transform(X,y)
      • X: 文本或者包含文本字符的可迭代对象
      • 返回值:返回sparse矩阵
    • TfidfVectorizer.inverse_transform(X)
      • X: array数组或者sparse矩阵
      • 返回值:转换之前数据格式
    • TfidfVectorizer.get_feature_names()
      • 返回值:单词列表
from sklearn.feature_extraction.text import TfidfVectorizer

tf = TfidfVectorizer()
data = tf.fit_transform(["life is short,I like python", "life is too long,I dislike python"])
print(tf.get_feature_names())
print(data.toarray())

特征的预处理

特征处理:通过特定的统计方法(数学方法)将数据转换成算法要求的数据

  • 数值型数据
    • 归一化
    • 标准化
  • 类别型数据:one-hot编码
  • 时间类型:时间的切分

特征处理的API:sklearn.preprocessing

归一化

特点:通过对原始数据进行变换把数据映射到(默认为[0,1])之间
公式: X ′ = x − m i n m a x − m i n ,   X ′ ′ = X ′ ∗ ( m x − m i ) + m i X^{'} = \frac{x-min}{max-min},\ X^{''}=X^{'}*(mx-mi)+mi X=maxminxmin, X=X(mxmi)+mi
:作用于每一列,max为一列最大值,min为一列最小值, X ′ ′ X^{''} X为最终结果,mx, mi分别为指定区间默认mx为1,mi为0.

  • MinMaxScalar(feature_range=(0,1))
    • 每个特征值缩放到给定范围(默认[0,1])
    • MinMaxScalar.fit_transform(X)
      • X: numpy array格式的数据[n_samples, n_features]
      • 返回值:转换后的形状相同的array
from sklearn.preprocessing import MinMaxScaler
mm = MinMaxScaler()
data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,40]])
print(data)

  • 目的:使得一个特征对最终结果不会造成更大的影响
  • 归一化总结:注意在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。

标准化

特点:通过对原始数据进行变换把数据变换到均值为0,方差为1的范围内
公式: X ′ = x − m e a n σ X'=\frac{x-mean}{\sigma} X=σxmean
:作用于每一列,mean为平均值, σ \sigma σ为标准差,var称为方差, v a r = ( x 1 − m e a n ) 2 + ( x 2 − m e a n ) 2 + . . . n var=\frac{(x_1-mean)^2+(x_2-mean)^2+...}{n} var=n(x1mean)2+(x2mean)2+..., σ = v a r \sigma=\sqrt{var} σ=var

  • StandardScaler(…)
    • 处理之后每列来说所有数据都聚集在均值0附近方差为1
    • StandardScaler.fit_transform(X,y)
      • X:numpy array格式的数据[n_samples,n_features]
      • 返回值:转换后的形状相同的array
    • StandardScaler.mean_
      • 原始数据中每列特征的平均值
    • StandardScaler.std_
      • 原始数据每列特征的标准差
from sklearn.preprocessing import StandardScaler

std = StandardScaler()

data = std.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,40]])

print(data)
  • 归一化与标准化对比
    • 对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然
      会发生改变
    • 对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对
      于平均值的影响并不大,从而方差改变较小。

缺失值处理

缺失值的处理方法

删除 若每列或行数据缺失值达到一定的比例,建议放弃整行或整列
插补 可以通过缺失值每行或每列的平均值、中位数来填充

sklearn缺失值API: sklearn.preprocessing.Imputer

  • Imputer(missing_values = ‘NaN’, strategy = ‘mean’, axis = 0)
    • 完成缺失值差不
    • Imputer.fit_transform(X,y)
      • X: numpy array格式的数据[n_samples, n_features]
      • 返回值:转换后的形状相同的array
from sklearn.preprocessing import Imputer

im= Imputer()

data = im.fit_transform([[1,2],[np.nan,3],[3,1]])

print(data)

关于np.nan(np.NaN)
1、numpy的数组中可以使用np.nan/np.NaN来代替缺失值,属于float类型
2、如果是文件中的一些缺失值,可以替换成nan,通过np.array转化成float型的数组即可

你可能感兴趣的:(机器学习,python)