机器学习——特征工程和文本特征工程提取

机器学习的数据:文件csv

可用的数据集:

  1. scikit-learn  :数据量小,方便学习
  2. kaggle: 大数据竞赛平台,真实数据,数据量巨大
  3. UCI:收录了360个数据集,覆盖科学、生活、经济等领域,数据量几十万

常用数据集数据的结构组成

  • 结构:特征值+目标值
  房子面积 房子位置 房子楼层 房子朝向 目标值
数据1 80 9 3 0 80
数据2 100 9 5 1 120
数据3 80 10 3 0 100

 

房子面积、房子位置、房子楼层、房子朝向皆为特征值

注意:有些数据集可用没有目标值

特征工程

特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的预测准确性

数据的特征抽取

下面用实例说明:

#特征抽取
#导入包
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())

运行结果如下所示:

机器学习——特征工程和文本特征工程提取_第1张图片

特征抽取对文本等数据进行特征值化

字典特征抽取

作用:对字典数据进行特征值化

类:sklearn.feature_extraction.CountVectorizer

DictVectorizer(sparse=True,...)

  • DictVectorizer.fit_transform(X)     

              X:字典或者包含字典的迭代器

               返回值:返回sparse矩阵

  • DictVectorizer.inverse_transform(X)

              X:array数组或者sparse矩阵

              返回值:转换之前数据格式

  • DictVectorizer.get_feature_names()

             返回类别的名称

  • DictVectorize.transform(X)

           按照原先的标准转换

 

实例说明:

from sklearn.feature_extraction import DictVectorizer


def dictverc():
    """
    字典数据抽取
    """
    # 实例化
    dict = DictVectorizer()
    # 调用fit_transform 返回sparse距阵
    data = dict.fit_transform(
        [{'city': u'beijing', 'temperature': 100}, {'city': u'shanghai', 'temperature': 90}, {'city':u 'qingdao', 'temperature': 80}]);
    # 输出
    #print(data)
    print(dict.get_feature_names())
    print(dict.inverse_transform(data))
if __name__=="__main":
    dictverc()

字典数据抽取:把字典中一些类别数据,分别进行转换成特征

运行结果机器学习——特征工程和文本特征工程提取_第2张图片

文本特征抽取

作用:对文本数据进行特征值化

类: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
def countvec():
    """
    对文本进行特征值化
    :return: None
    """
    cv=CountVectorizer()
    data=cv.fit_transform({"人生苦短,我喜欢python","人生漫长,不用python"})
    print(data.toarray())
    return None
if __name__=="__main":
    countvec()

运行结果如下:机器学习——特征工程和文本特征工程提取_第3张图片

  • 统计文章的所有词,重复的只看作一次 词的列表
  • 对每篇文章,在词的列表里面进行统计每个词出现的次数
  • 单个字母不统计

中文的文本特征抽取

jieba分词

import jieba

返回值:词语生成器

代码实例说明

from sklearn.feature_extraction.text import CountVectorizer
import jieba
def cutword():
    con1=jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
    con2=jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")
    con3=jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。  了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")
    #转换成列表
    content1=list(con1)
    content2 = list(con2)
    content3 = list(con3)
    #把列表转换成字符串
    c1= ' '.join(con1)
    c2 = ' '.join(con2)
    c3 = ' '.join(con3)

    return c1,c2,c3
def hanzivec():
    """
    中文特征值化:
    :return:
    """
    c1,c2,c3=cutword()
    print(c1,c2,c3)
    cv = CountVectorizer()
    data = cv.fit_transform([c1,c2,c3])
    # data = cv.fit_transform({"人生苦短,我喜欢python", "人生漫长,不用python"})
    print(cv.get_feature_names())
    print(data.toarray())
    return None
if __name__=="__main":
    hanzivec()

运行结果如下所示:

单个词不会被统计在内

tf-idf分析问题

Tf:term frequency:词的频率    出现的次数

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

log(数值):输入的数值越小,结果越小

反应的是重要性的程度

TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。

TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其他一份文件的重要程度。

类:sklearn.feature_extraction.text.TfidfVectorizer

  • TfidfVectorizer(stop_words=None,...)

         返回词的权重矩阵

  • tfidfVectorizer.fit_transform(X)

        X:文本或者包含文本字符串的可迭代对象

        返回值:返回sparse矩阵

  • tfidfVectorizer:inverse_transform(X)

        X:array数组或者sparse矩阵

        返回值:转换之前数据形式

  • tfidfVectorizer.get_feature_names()

        返回值:单词列表

from sklearn.feature_extraction.text import TfidfVectorizer
import jieba
def cutword():
    con1=jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
    con2=jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")
    con3=jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。  了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")
    #转换成列表
    content1=list(con1)
    content2 = list(con2)
    content3 = list(con3)
    #把列表转换成字符串
    c1= ' '.join(con1)
    c2 = ' '.join(con2)
    c3 = ' '.join(con3)

    return c1,c2,c3
def tfidfvec():
    """
    中文特征值化
    :return: None
    """
    c1, c2, c3 = cutword()
    print(c1, c2, c3)
    tf= TfidfVectorizer
    data = tf.fit_transform([c1,c2,c3])
    print(data)
    return None
if __name__=="__main":
    tfidfvec()

运行结果如下所示:

机器学习——特征工程和文本特征工程提取_第4张图片

你可能感兴趣的:(Python)