机器学习——特征工程、特征抽取

特征工程

1 数据集

1.1 数据集的获取

  • 花钱:公司内部:百度;数据接口。
  • 免费—学习阶段可使用的数据集:
  1. sklearn
  2. kaggle
  3. UCI
    这里介绍的是我们经常使用的sklearn数据集。

2 sklearn数据集

2.1 sklearn数据的获取

sklearn.datasets

  • load_* 获取小规模数据集
    例子:
sklearn.datasets.load_iris()
  • fetch_* 获取大规模数据集
    例子:
sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)

2.2 sklearn数据集的返回值

datasets.base.Bunch(继承自字典)
dict["key"] = values
bunch.key = values

2.3sklearn数据集的划分

  • 训练数据:用于训练,构建模型
  • 测试数据:在模型检验时使用,用于评估模型是否有效
测试集 20%~30%
sklearn.model_selection.train_test_split(arrays, *options)
训练集特征值,测试集特征值,训练集目标值,测试集目标值
x_train, x_test, y_train, y_test

2.4对sklearn数据的使用

代码展示:

from sklearn.datasets import load_iris#小规模:load大规模:bunch
from sklearn.model_selection import train_test_split

def datasets_demo():
    '''
    sklearn数据集的使用
    '''
    #1、数据集的获取
    iris=load_iris()
    print("花数据集:\n",iris)
    print("查看数据集的描述:\n",iris["DESCR"])
    print("查看特征值的名字:\n",iris.feature_names)
    print("查看特征值:\n",iris.data.shape)
    #2、数据集的划分
    #训练集特征值,测试集特征值,训练集目标值,测试集目标值
     #x_train, x_test, y_train, y_test
    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)
    
    return None

结果展示:
在这里插入图片描述

3 特征工程

特征抽取:将任意数据集转化成用于机器学习的数字特征

sklearn.feature_extraction

3.1字典特征提取

  • 类别->one-hot编码
sklearn.feature_extraction.DictVectorizer(sparse=True,)
    vector 数学:向量 物理:矢量
    矩阵 matrix 二维数组
    向量 vector 一维数组
  • sparse稀疏矩阵
    将非零值 按位置表示出来
    节省内存 - 提高加载效率
  • 应用场景
  1. pclass, sex 数据集当中类别特征比较多
    将数据集的特征->字典类型
    DictVectorizer转换
  2. 本身拿到的数据就是字典类型
3.1.1 字典特征抽取案例

代码展示:

from sklearn.feature_extraction import DictVectorizer

'''
特征抽取:将原始数据特征值化。
'''
def dict_demo():
    '''
    字典特征提取
    '''
    data = [{'city': '北京','temperature':100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]
    #1、实例化一个转换类DictVectorizer
    transfer=DictVectorizer(sparse=True)
    #2、调用fit_transform,转换数据
    data_new=transfer.fit_transform(data)
    print("data_new:\n",data_new.toarray(),type(data_new))
    print("特征名字:\n",transfer.get_feature_names())
    
    return None

结果:
在这里插入图片描述

3.2 文本特征抽取

一般情况是让单词作为特征。
特征:特征词

  • 方法1:CountVectorizer
    统计每个样本特征词出现的个数。
    stop_words停用的词表
    关键词:在某一个类别的文章中,出现的次数很多,但是在其他类别的文章当中出现很少
  • 方法2:TfidfVectorizer
    TF-IDF - 重要程度
    TF - 词频(term frequency,tf)
    IDF - 逆向文档频率
    例子
    比如说我们有两个次“经济”,“非常”。语料库有1000篇文章,其中100篇中有“非常”,10篇“经济”。
  • 文章A(100词):10次“经济”TF-IDF:0.2
  • tf:10/100=0.1
  • idf:lg 1000/10=2
  • 文章B(100词):10次“非常” TF-IDF:0.1
  • tf:10/100=0.1
  • idf:log 10 1000/100=1
3.2.1 英文文本特征提取案例

代码展示:

from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
def  count_demo():
    '''
    英文文本特征提取
    '''
    data = ["life is short,i like like python", "life is too long,i dislike python"]
    #1、实例化一个转化器类.CountVectorizer统计文本每个样本特征值出现的次数。
    transfer=CountVectorizer(stop_words=["is","too"])#停用词stop_words
    #2、调用fit_transform
    data_new=transfer.fit_transform(data)
    print("data_new\n",data_new.toarray())
    print("特征的名字:\n",transfer.get_feature_names())

    return None

结果:
在这里插入图片描述

3.2.2中文文本特征抽取

代码展示:

from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
def  count1_demo():
    '''
    中文文本特征提取
    '''
    data = ["一 二三 四五", "上 山打 老虎"]
    #1、实例化一个转化器类.CountVectorizer统计文本每个样本特征值出现的次数。
    transfer=CountVectorizer()
    #2、调用fit_transform
    data_new=transfer.fit_transform(data)
    print("data_new\n",data_new.toarray())
    print("特征的名字:\n",transfer.get_feature_names())

    return None
if __name__=="__main__":
    count1_demo()

结果:
在这里插入图片描述

3.2.3中文文本特征抽取——自动分词

代码:

from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
def cut_word(text):
    '''
    进行中文分词:"我爱北京天安门" --> "我 爱 北京 天安门"
    '''
    text=" ".join(list(jieba.cut(text)))
    return text


def count_chinese_demo():
    '''
    中文文本特征提取,自动分词
    '''
    # 将中文文本进行分词
    data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
            "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
            "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
    data_new=[]
    for sent in data:
        data_new.append(cut_word(sent))
        #print(data_new)  
    #1、实例化一个转化器类.CountVectorizer统计文本每个样本特征值出现的次数。
    transfer=CountVectorizer(stop_words=["一种","今天"])
    #2、调用fit_transform
    data_fianl=transfer.fit_transform(data_new)
    print("data_new\n",data_fianl.toarray())
    print("特征的名字:\n",transfer.get_feature_names())   
    return None

if __name__=="__main__":
    count_chinese_demo()

结果:
在这里插入图片描述

3.2.4用TF-IDF的内容进行抽取

代码:

def cut_word(text):
    '''
    进行中文分词:"我爱北京天安门" --> "我 爱 北京 天安门"
    '''
    text=" ".join(list(jieba.cut(text)))
    return text
def tfidf_demo():
    '''
    用TF-IDF的内容进行抽取
    '''
     # 将中文文本进行分词
    data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
            "我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
            "如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
    data_new=[]
    for sent in data:
        data_new.append(cut_word(sent))
        #print(data_new)  
    #1、实例化一个转化器类.
    transfer=TfidfVectorizer(stop_words=["一种","今天"])
    #2、调用fit_transform
    data_fianl=transfer.fit_transform(data_new)
    print("data_new\n",data_fianl.toarray())
    print("特征的名字:\n",transfer.get_feature_names())   
    return None
if __name__=="__main__":
    tfidf_demo()

结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值