机器学习——特征工程

1 .特征工程概念

特征工程的目的是让机器可以识别到我们前面的特征即iris.data数据,现在生活中常常有问题比如文本,图像,字典等等数据机器不能直接识别,所有要进行特征工程;除此之外,也有筛选一些没有影响或者对我们目标的影响不大的特征。

常见的特征提取有字典特征提取、文本特征提取、图像特征提取等。一般使用pandas来进行数据清洗和数据处理、使用sklearn来进行特征工程

2.特征工程的过程

特征工程步骤为:1.特征提取, 如果不是表格数据,要进行特征提取,比如字典特征提取,文本特征提取2.无量刚化(预处理):归一化,标准化3.降维底方差过滤特征选择,主成分分析-PCA降维

3特征提取

特征提取在于让我们的数据可以被计算机直接识别处理,像文本,字典,图像等要先预处理(这里默认先用pandas进行了预处理,处理了非零或者异常数据)

3.1DictVectorizer 字典列表特征提取

from sklearn.feature_extraction import DictVectorizer
import sklearn
data = [{'name':'虎先锋', 'age':21, 'temperature':200}, {'city':'黑熊精','age':16, 'temperature':60}, {'city':'黄风大仙', 'age':26, 'temperature':80}]
transfer = DictVectorizer(sparse=False)
data_new = transfer.fit_transform(data)
print(data_new)

 

先明白 DictVectorizer是一个转换器对象,这个API官方自己可以转换字典列表 参数设置: 

sparse=True返回类型为csr_matrix的稀疏矩阵

sparse=False表示返回的是数组,数组可以调用.toarray()方法将稀疏矩阵转换为数组

补充知识:

稀疏矩阵

稀疏矩阵是指一个矩阵中大部分元素为零,只有少数元素是非零的矩阵。由于稀疏矩阵中零元素非常多,存储和处理稀疏矩阵时,通常会采用特殊的存储格式,以节省内存空间并提高计算效率。

三元组表:三元组表就是一种稀疏矩阵类型数据,存储非零元素的行索引、列索引和值(一种非常有用的存储方式,节约内存,面试可能会问),例如[3,4]12代表第三行第四列的值为12,其余0

代码思路:导入sklearn库和字典列表特征处理模块(这样的写法不用每次调用DictVectorizer的时候都要写sklearn.feature_extraction.DictVectorizer),导入data数据,创建一个DictVectorizer类型的转换器,然后用转换器转换诗句并且学习如何转换特征

难点:fit的底层是计算出数据的平均值,标准差等等数据,让transform可以通过底层的数学的算法调用fit的数据,从而达到数据的转换,或者想要的效果,底下是官方资料:

  1. fit:

    • 这个方法用来计算数据的统计信息,比如均值和标准差(在StandardScaler的情况下)。这些统计信息随后会被用于数据的标准化。

    • 你应当仅在训练集上使用fit方法。

  2. fit_transform:

    • 这个方法相当于先调用fit再调用transform,但是它在内部执行得更高效。

    • 它同样应当仅在训练集上使用,它会计算训练集的统计信息并立即应用到该训练集上。

  3. transform:

    • 这个方法使用已经通过fit方法计算出的统计信息来转换数据。

    • 它可以应用于任何数据集,包括训练集、验证集或测试集,但是应用时使用的统计信息必须来自于训练集。

 不演示sparse=True的结果了,最终的结果没有区别,除非打印出转换的数据(一个稀疏矩阵,一个三元组表),稀疏矩阵对象调用toarray()函数, 得到类型为ndarray的二维稀疏矩阵

3.2 CountVectorizer 文本特征提取

3.2.1英文文本提取

from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
data=["how are you, i am fine", "And you"]
transfer = CountVectorizer(stop_words=["you"])
data_new = transfer.fit_transform(data)
print("特征名字:\n", transfer.get_feature_names_out())
print(data_new)

import pandas
pandas.DataFrame(data_new.toarray(), 
                 index=["第一个句子","第二个句子"],
                 columns=transfer.get_feature_names_out())

 

注意:这种形式不能被计算机直接识别,要将它转换为DataFrame或者ndarry形式,稀疏矩阵对象调用toarray()函数, 得到类型为ndarray的二维稀疏矩阵

API是CountVectorizer(),这依然是一个转换器英文文本转换器,参数设置:stop_words是黑名单,代表不转换的词,这个便于学习,打印出特征名字,方法还是创立转换器直接 转换数据,再拿给fit_transform生成新的ndarry(可以被计算机识别)

data_arry=data_new.toarray()
print(data_arry)

这里提取的结果是一个稀疏矩阵,使用numpy可以给它加横标纵标,其实文本的提取就是将它换成稀疏矩阵的一个过程

3.2.2中文文本提取

import jieba
from sklearn.feature_extraction.text import CountVectorizer
def cut(text):
    return " ".join(list(jieba.cut(text)))
data = ["教育学会会长期间坚定支持民办教育事业!","热忱关心、扶持民办学校发展","事业做出重大贡献!"]
data_new = [cut(v) for v in data]
transfer = CountVectorizer(stop_words=['期间', '做出']) 
data_final = transfer.fit_transform(data_new)
import pandas as pd
x=pd.DataFrame(data_final.toarray(), columns=transfer.get_feature_names_out())
print(x)

 .中文文本不像英文文本,中文文本文字之间没有空格,所以要先分词,一般使用jieba分词.

下载指令:pip install jieba

 注意要点:采用结巴分词后,将词语保存在一个List之中,日后工作中一般是取一点用一点,节约内存空间,取词是python的语法,正常的设置黑名单,存出的结果是一个稀疏矩阵

3.3 TfidfVectorizer TF-IDF文本特征词的重要程度特征提取

 这个知识点了解,能用即可,有需求就做,没需求也不用,一般需求意义不大(在我看来)

import jieba
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
def cut_words(text):
    return " ".join(list(jieba.cut(text)))

data = ["孙悟空在上一世失了六意,要一一寻找",  "我光头强就打了三个小时没有都没有过"]
data_new = [cut_words(v) for v in data]
transfer = TfidfVectorizer(stop_words=['孙悟空', '光头强']) 
data_final = transfer.fit_transform(data_new)
pd.DataFrame(data_final.toarray(), columns=transfer.get_feature_names_out())

from sklearn.feature_extraction.text import CountVectorizer
transfer = CountVectorizer(stop_words=["天命人"]) 
data_final = transfer.fit_transform(data_new)
pd.DataFrame(data_final.toarray(), columns=transfer.get_feature_names_out())

 4.无量纲化-预处理

 数据的预处理,除了通过pandas消除错误数据,空白数据等等,下一类数据的提取,让计算机把不能识别的数据识别,下一类计算机识别的数据,但是他们重要程度不同,比如身高一米七收入一万和身高一米八收入五千不同数据的在人们心中有权重,但是计算机没有所有要无量纲化消除单位的概念引入计算机的权统一识别这些数据

4.1MinMaxScaler 归一化

就是按比例分配,比如最高值是100,最低值是0,那么让100的权重为1,0的权重为0,那么90的权重为0.9,80的权重为0.8,数据的重要程度就有了解释

归一化API

sklearn.preprocessing.MinMaxScaler(feature_range)

参数:feature_range=(0,1) 归一化后的值域,可以自己设定

fit_transform函数归一化的原始数据类型可以是list、DataFrame和ndarray, 不可以是稀疏矩阵

fit_transform函数的返回值为ndarray

from sklearn.preprocessing import MinMaxScaler
data=[[12,22,4],[22,23,1],[11,23,9]]
feature_range=(0, 1)
transfer = MinMaxScaler(feature_range=(0, 1))
data_new = transfer.fit_transform(data)
print(data_new)

 

缺点是容易受到异常值的影响,比如有个值特别特别大,那么其他值都会很小 

4.2 StandardScaler 标准化

 为了解决较大值对数据的处理,引入了Z-score标准化(StandardScaler是API函数,不是特定的方法),也称为零均值标准化。它通过对每个特征的值减去其均值,再除以其标准差,将数据转换为均值为0,标准差为1的分布。(这个方法会更常用一点)

引入了方差的概念,相对是求每个数据对数据总体的波动概念(其实大概也能想明白,但是做上游的人还是厉害,开发出来),提供一个自己的思路,数据划分按照高斯分布进行划分,没时间研究了,如果现在没有研究,你研究出来或许能拿奖

from sklearn.preprocessing import StandardScale
feature_range=(0, 1)
transfer = StandardScaler()
data_new = transfer.fit_transform(data)

 标准化API   sklearn.preprocessing.StandardScale

原始数据类型可以是list、DataFrame和ndarray

fit_transform函数的返回值为ndarray, 归一化后得到的数据类型都是ndarray

5.特征降维

 特征降维就是去掉一下对于目标意义不大的特征,或者将一些特征合并为一个特征(每减少一个维度,计算量要减少很大一截)

特征降维的方向:第一种选择合适的特征,去掉不合适的特征 第二种把一些相关不大特征合成

5.1 特征选择

5.1.1低方差过滤特征选择

思想:选择过滤掉不相关的数据,比如人都有两个眼睛那么这个数据就对于目标不重要,对于每个特征计算它在整个训练集上自己这个特征的方差(方差可以理解为自己的梯度),如果方差低于我们设置的阈值,那么就不要这个特征了

API:sklearn.feature_selection.VarianceThreshold(threshold=2.0)    

参数设置:threshold代表我们设置的方差阈值

from sklearn.feature_selection import VarianceThreshold
import pandas as pd
def VT_demo():
    data=pd.DataFrame([[50,40,20],[50,30,300],[50,20,4000],[50,10,50000]])
    transfer = VarianceThreshold(threshold=100)
    data_new = transfer.fit_transform(data)
    print(data_new)
    return None
VT_demo()

 

可以看到阈值低于100的第一列特征去掉了,代码思路依旧,创建一个转换器,让转换器进行数据的转换并fit学习方法,让transform转换成可以被计算机识别的参数

5.1.2根据相关系数的特征选择

了解两个特征的相关性,相关系数越接近1代表相关程度越高(就是他们向量内积的余弦值),相关系数越高就代表他们是一个向量,特别高就筛选掉

现在已经不用它了,如果他们相关系数那么高,那么直接转换到一个方向即可,即主成分分析法PCA,这个了解即可

5.2主成份分析(PCA)

 PCA的核心是把一个向量(多个)投影到某一个向量上,并且尽可能减少数据损失,直接进行降维操作,简化运算和噪声(官方定义:PCA的核心目标是从原始特征空间中找到一个新的坐标系统,使得数据在新坐标轴上的投影能够最大程度地保留数据的方差,同时减少数据的维度。 )

 

具体的数学逻辑上面已经讲了,如果想要具体了解学习可以参考:youtoe大神3brown1bule 

API:PCA(n_components=None) 参数设置:实参为小数时:表示降维后保留百分之多少的信息,实参为整数时:表示减少到多少特征

from sklearn.decomposition import PCA
def pca_demo():
    data = [[2,8,4,5], 
            [6,3,0,8], 
            [5,4,9,1]]
    transfer = PCA(n_components=3)
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)
    return None
pca_demo()

 

 四维度数据转换成了三维度数据,这个数据计算机认识,人不认识很正常

熟悉这种代码写法 创立转换器,创立一个部分,调用这个部分,一些面向对象思想的体现(前面的博客都是面向编程为主)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值