机器学习入门(二):特征工程——特征抽取

特征工程

一.为什么需要特征工程?
      因为“数据和特征决定机器学习的上限,而模型和算法只是逼近这个上限而已”,使用专业背景知识和技巧处理数据,使算法变得更好。
二.什么是特征工程
      sklearn库用于做特征工程
      pandas库用来做数据清洗、数据处理。

特征抽取

    定义:将任意数据(如文本或图像)转换为可用于机器学习的数字特征,也叫特征值化
    使用sklearn.feature_extraction()函数
            字典数据:使用字典特征提取
            文本数据:使用文本特征提取
            图像数据:使用图像特征提取

1.字典特征提取(将字典中属于类别的特征 转化为 one-hot编码
     目的:将字典中属于类别的特征 转化为 one-hot编码
     应用场景:a.当数据集中类别特征比较多时(先将数据集中的特征转换为字典类型,再使用DictVectorizer()进行字典特征抽取)
                       b.当你本身拿到的数据就是字典类型时
          

from sklearn.feature_extraction import DictVectorizer

            `在这里插入图片描述
代码实现:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
# def datasets_demo():
#     #获取数据集
#      iris=load_iris()
#      print('鸢尾花数据集:\n',iris)
#      print('查看数据集描述:\n', iris['DESCR'])
#      print('查看特征值的名字:\n', iris.feature_names)
#      print('查看特征值:\n', iris.data, iris.data.shape)
#      #数据集划分
#      x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)
#      print('训练集的特征值:\n',x_train,x_train.shape)
def dict_demo():
    data=[{
    
    'city':'北京','temperature':100},{
    
    'city':'上海','temperature':100},{
    
    'city':'深圳','temperature':30}]
   #实例化一个转换器类
    transfer=DictVectorizer()
    #调用fit_tranform()
    data_new=transfer.fit_transform(data)
    print('data_new:\n',data_new)
if __name__=='__main__':
    #datasets_demo()
    dict_demo()

返回一个sparse矩阵(稀疏矩阵):
在这里插入图片描述
 设置sparse=Flase时,返回二维数组:

transfer=DictVectorizer(sparse=False)

在这里插入图片描述
返回稀疏矩阵的好处:当特征太多时,可以省略很多很多0

返回特征名字:

def dict_demo():
    data=[{
    
    'city':'北京','temperature':100},{
    
    'city':'上海','temperature':100},{
    
    'city':'深圳','temperature':30}]
   #实例化一个转换器类
    transfer=DictVectorizer(sparse=False)
    #调用fit_tranform()
    data_new=transfer.fit_transform(data)
    feature_names=transfer.get_feature_names()

    print('data_new:\n',data_new)
    print('特征名字:\n', feature_names)

在这里插入图片描述
2.文本特征抽取(按特征词提取)

  方法一:CountVectorizer()(统计每个样本特征词出现的个数)忽略单个字母和标点符号
在这里插入图片描述
           ①.当特征词为英文时:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer
def count_demo():
      '''
      英文文本特征提取
      '''
     data=['life is short,i like like python','life is too long,i dislike python ']
     #实例化一个转换器类
     transfer=CountVectorizer()
     # 调用fit_tranform()
     data_new=transfer.fit_transform(data)
     feature_names = transfer.get_feature_names()
     print('data_new:\n', feature_names)
     print('data_new:\n',data_new)
     #将稀疏矩阵转换为二维数组
     print('data_new:\n', data_new.toarray())
if __name__=='__main__':
    #datasets_demo()
    # dict_demo()
    count_demo()

在这里插入图片描述
          ②.当特征词为中文时:(不支持单个中文字)
         每个字之间没有空格就会认为这句话是一个词:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer
def count_Chinese_demo():
    """
    中文文本特征提取
    """
    data = ['我爱北京天安门', '天安门最好看']
    # 实例化一个转换器类
    transfer = CountVectorizer()
    # 调用fit_tranform()
    data_new = transfer.fit_transform(data)
    feature_names = transfer.get_feature_names()
    print('data_new:\n', feature_names)
    print('data_new:\n', data_new)
    # 将稀疏矩阵转换为二维数组
    print('data_new:\n', data_new.toarray())
if __name__=='__main__':
    #datasets_demo()
    # dict_demo()
    # count_demo()
    count_Chinese_demo()

在这里插入图片描述
       每个词之间有空格,他才能识别出来(手动分词),若想不进行手动分词,那就使用jieba库记性自动分词

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer
def count_Chinese_demo():
    data = ['我 爱 北京 天安门', '天安门 最好看']
    # 实例化一个转换器类
    transfer = CountVectorizer()
    # 调用fit_tranform()
    data_new = transfer.fit_transform(data)
    feature_names = transfer.get_feature_names()
    print('data_new:\n', feature_names)
    print('data_new:\n', data_new)
    # 将稀疏矩阵转换为二维数组
    print('data_new:\n', data_new.toarray())
if __name__=='__main__':
    #datasets_demo()
    # dict_demo()
    # count_demo()
    count_Chinese_demo()

在这里插入图片描述

使用jieba库(中文自动分词)

例一:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer
import jieba
def  cut_word(text):
    #返回生成器对象
    a=jieba.cut(text)
    print('生成器对象:',a)
    #转换为列表
    a = list(jieba.cut(text))
    print('列表:',a)
    #转换成字符串
    a=''.join(list(jieba.cut(text)))
    print('字符串:',a)
if __name__=='__main__':
    cut_word('我爱北京天安门')

在这里插入图片描述
例二:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer
import jieba
def cut_word(text):
    text=" ".join(list(jieba.cut(text)))
    return text
def count_Chinese_demo2():
    """中文文本特征抽取,自动分词
    :return:"""
    #1.将中文文本分词
    data=["北京时间,常规赛下半段赛程正式打响,今天一共有两场比赛,奇才输给了灰熊,马刺输给了独行侠。",
          '继火箭之后,马刺也将进入市场,开始甩卖老将,首当其冲就是球队功勋阿尔德里奇。',
          '此外杜兰特也有坏消息,他的伤势问题,包括他如今带领的篮网也引来非议。']
    data_new=[]#建一个空列表
    for sent in data:
        data_new.append(cut_word(sent))
    print('新的,分好词的列表:\n',data_new)
    #2.对分好词的新列表,进行文本特征抽取
    # 实例化一个转换器类
    transfer = CountVectorizer()
    # 调用fit_tranform()
    data_final = transfer.fit_transform(data_new)
    print('data_new:\n', data_final.toarray())
    print('特征名字:\n', transfer.get_feature_names())
if __name__=='__main__':
    count_Chinese_demo2()

在这里插入图片描述
方法一的缺点:无法找到关键词(在某一类文章中出现的次数很多,但是在其他类别的文章中出现次数很少)

方法二:Tf-idf()文本特征提取(在机器学习前期数据处理中很重要)
      目的: 若一个词或者短语在一篇文章中出现的概率高,但是在其他文章中很少出现,则评估这个词后者端对这篇文章很重要。
在这里插入图片描述
在这里插入图片描述

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
import jieba
def tfidf_demo():
    """使用Tf-IDF进行中文文本特征抽取
    :return:"""
    #1.将中文文本分词
    data=["北京时间,常规赛下半段赛程正式打响,今天一共有两场比赛,奇才输给了灰熊,马刺输给了独行侠。",
          '继火箭之后,马刺也将进入市场,开始甩卖老将,首当其冲就是球队功勋阿尔德里奇。',
          '此外杜兰特也有坏消息,他的伤势问题,包括他如今带领的篮网也引来非议。']
    data_new=[]
    for sent in data:
        data_new.append(cut_word(sent))
    print('新的,分好词的列表:\n',data_new)
    #2.对分好词的新列表,进行文本特征抽取
    # 实例化一个转换器类
    transfer = TfidfVectorizer()
    # 调用fit_tranform()
    data_final = transfer.fit_transform(data_new)
    print('data_new:\n', data_final.toarray())
    print('特征名字:\n', transfer.get_feature_names())
if __name__=='__main__':
    tfidf_demo()

在这里插入图片描述
    结果的二维数组中概率大的值就是出现次数多的词,适合当关键词用于分类

总结:

   特征抽取的目的:将原始数据进行特征值化,方便我们后续处理
      1.对字典进行特征抽取:将字典数据中的类别转换为one-hot编码
      2.对文本进行特征抽取:
            法一:使用CountVectorizer(),统计每个样本特征词出现的个数
            法二:计算Tf-idf()指标,评估这篇文章中每个词的重要程度

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45234219/article/details/114641570
今日推荐