特征工程

数据集的组成:特征值+目标值

pyspark 特征工程 特征相关性分析 特征工程python代码_机器学习

特征工程的定义

pyspark 特征工程 特征相关性分析 特征工程python代码_数据_02

特征工程包含:数据特征抽取、数据特征预处理、数据降维。

pyspark 特征工程 特征相关性分析 特征工程python代码_数据_03

特征抽取

pyspark 特征工程 特征相关性分析 特征工程python代码_方差_04


pyspark 特征工程 特征相关性分析 特征工程python代码_机器学习_05

实例演示

from sklearn.feature_extraction.text import CountVectorizer
#
# # 实例化CountVectorizer
#
vector = CountVectorizer()
#
# # 调用fit_transform输入并转换数据

res = vector.fit_transform(["life is short,i like python","life is too long,i dislike python"])

# # 打印结果
print(vector.get_feature_names())
print(res.toarray())
'''
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
[[0 1 1 1 0 1 1 0]
 [1 1 1 0 1 1 0 1]]
'''

通过演示得出结论:
特征抽取对非连续型数据、对文本特征值化。

目的:特征化是为了计算机更好去理解数据。

Sklearn中特征抽取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

dict = DictVectorizer()

data = dict.fit_transform([{'city': '北京','temperature': 100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature': 30}])
print(data)
print(dict.get_feature_names())
print(dict.inverse_transform(data))

输出结果解释如下:

pyspark 特征工程 特征相关性分析 特征工程python代码_方差_06

one- hot编码分析

pyspark 特征工程 特征相关性分析 特征工程python代码_机器学习_07

pyspark 特征工程 特征相关性分析 特征工程python代码_python_08

文本抽取:sklearn.feature_extraction.text.CountVectorizer

CountVectorizer(max_df=1.0,min_df=1,…)
返回词频矩阵

CountVectorizer.fit_transform(X,y)
X:文本或者包含文本字符串的可迭代对象
返回值:返回sparse矩阵

CountVectorizer.inverse_transform(X)
X:array数组或者sparse矩阵
返回值:转换之前数据格式

CountVectorizer.get_feature_names()
返回值:单词列表

"""
    对文本进行特征值化
    :return: None
    """
cv = CountVectorizer()

data = cv.fit_transform(["life is short,i like python","life is too long,i dislike python"])
#data1 = cv.fit_transform(["人生 苦短,我 喜欢 python", "人生漫长,不用 python"])
#中文的一个字和英文的单个字母是不被统计的,但是中文字用空格和标点分开就会被统计
print(cv.get_feature_names())

#调用fit_transform方法输入数据并转换 
#注意返回格式,利用toarray()进行sparse矩阵转换array数组
print(data.toarray())

pyspark 特征工程 特征相关性分析 特征工程python代码_数据_09

利用jieba库提取中文

pyspark 特征工程 特征相关性分析 特征工程python代码_python_10

import jieba

con1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")

con2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")

con3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")

content1 = list(con1)
content2 = list(con2)
content3 = list(con3)

c1 = ' '.join(content1)
c2 = ' '.join(content2)
c3 = ' '.join(content3)

from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer()
data = cv.fit_transform([c1,c2,c3])
print(cv.get_feature_names())
print(data.toarray())

tf和idf:sklearn.feature_extraction.text.TfidfVectorizer

pyspark 特征工程 特征相关性分析 特征工程python代码_机器学习_11

tf: term frequency 词的频率
tf=出现的次数

idf: inverse document frequency 逆文档频率
idf = log(总文档数/该词出现的文档数)

重要性程度 = tf * idf

TfidfVectorizer语法

分类机器学习算法的的重要依据

pyspark 特征工程 特征相关性分析 特征工程python代码_方差_12

tf = TfidfVectorizer()

    data = tf.fit_transform([c1, c2, c3])

    print(tf.get_feature_names())

    print(data.toarray())

数据特征预处理:

pyspark 特征工程 特征相关性分析 特征工程python代码_python_13

归一化和标准化 sklearn.preprocessing

归一化:sklearn.preprocessing.MinMaxScaler

特征同等重要时要做归一化,使得一个特征不会对最终结果造成重大影响。

pyspark 特征工程 特征相关性分析 特征工程python代码_数据_14


MinMaxScalar(feature_range=(0,1)…)

每个特征缩放到给定范围(默认[0,1])

MinMaxScalar.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array

总结:

pyspark 特征工程 特征相关性分析 特征工程python代码_python_15

mm = MinMaxScaler(feature_range=(2, 3))

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

    print(data)

标准化:scikit-learn.preprocessing.StandardScaler

pyspark 特征工程 特征相关性分析 特征工程python代码_python_16

pyspark 特征工程 特征相关性分析 特征工程python代码_数据_17

StandardScaler(…)
处理之后每列来说所有数据都聚集在均值0附近方差为1

StandardScaler.fit_transform(X,y)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array

StandardScaler.mean_
原始数据中每列特征的平均值

StandardScaler.std_
原始数据每列特征的方差

"""
    标准化缩放
    :return:
    """
    std = StandardScaler()

    data = std.fit_transform([[ 1., -1., 3.],[ 2., 4., 2.],[ 4., 6., -1.]])

    print(data)

总结:

pyspark 特征工程 特征相关性分析 特征工程python代码_python_18

缺失值处理:sklearn.preprocessing.Imputer

pyspark 特征工程 特征相关性分析 特征工程python代码_数据_19

pyspark 特征工程 特征相关性分析 特征工程python代码_机器学习_20

pyspark 特征工程 特征相关性分析 特征工程python代码_机器学习_21

pyspark 特征工程 特征相关性分析 特征工程python代码_python_22

Imputer(missing_values=‘NaN’, strategy=‘mean’, axis=0)
完成缺失值插补

Imputer.fit_transform(X,y)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后的形状相同的array

降维(降低特征数量)

特征选择

pyspark 特征工程 特征相关性分析 特征工程python代码_方差_23

特征选择就是:单纯地从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前和选择后可以改变值、也不改变值,但是选择后的特征维数肯定比选择前小,毕竟我们只选择了其中的一部分特征。

主要方法(三大武器)
1、Filter(过滤式):VarianceThreshold,方差过滤
2、Embedded(嵌入式):正则化、决策树
3、Wrapper(包裹式,用的比较少)

过滤式:sklearn.feature_selection.VarianceThreshold

方差大小:考虑所有样本的数据情况

VarianceThreshold(threshold = 0.0)
删除所有低方差特征

Variance.fit_transform(X,y)
X:numpy array格式的数据[n_samples,n_features]
返回值:训练集差异低于threshold的特征将被删除。
默认值是保留所有非零方差特征,即删除所有样本
中具有相同值的特征。

"""
    特征选择-删除低方差的特征
    """
    var = VarianceThreshold(threshold=1.0)

    data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])

PCA:主成分分析

当特征数量达到上百个的时候考虑数据简化。
数据会改变,特征数量也会减少。

目的:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。

作用:可以削减回归分析或者聚类分析中特征的数量

PCA(n_components=None)
将数据分解为较低维数空间
n_components 为小数时为保留特征的信息量比例
为整数时为保留特征数量(在未知情况下不知道多少个特征合适,所以一般不用)

PCA.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:转换后指定维度的array

降维案例

pyspark 特征工程 特征相关性分析 特征工程python代码_数据_24

流程图

pyspark 特征工程 特征相关性分析 特征工程python代码_数据_25

pyspark 特征工程 特征相关性分析 特征工程python代码_python_26

pyspark 特征工程 特征相关性分析 特征工程python代码_python_27

pyspark 特征工程 特征相关性分析 特征工程python代码_python_28