02_特徵工程和文本特徵提取

02 特徵工程和文本特徵提取

數據集的構成

數據存放形式

  1. CSV 文件
  2. mysql: 性能瓶頸,讀取速度; 格式不符合機器學習的格式
  3. pandas:讀取工具
  4. numpy爲何讀取速度快:
  • 動態語言
  • 全局解釋性鎖 GIL : 釋放了 (GIL數據安全),真正的多線程

可用的數據集

  1. Kaggle : 大數據競賽平臺、真實數據、數據量大
  2. UCI: 數據集覆蓋科學、生活、經濟等領域
  3. Scikit-learn: 數據量小,方便學習

數據集的結構組成

  • 結構: 特徵值 + 目標值
    數據集結構組成

特徵工程的定義

特徵工程是什麼?

特徵工程:將原始數據轉換爲更好地表明預測模型的潛在問題的特徵的過程,從而提供了對未知數據的預測準確性。python

  • 很大程度上影響最後模型的精度

數據中對特徵的處理

  1. Pandas: 數據讀取方便,基本的處理格式的工具
  • DataFrame - 缺失值,數據處理
  • 機器學習:重複值不須要進行處理
  1. Sklearn: 對特徵進行處理提供強大的接口
  • Python機器學習工具,包含許多知名算法的實現
  • 豐富的API
    特徵處理過程

數據的特徵抽取

定義:

  • 特徵抽取是對文本等數據進行特徵值化
  • 特徵值化:讓計算機更好的瞭解數據

Sklearn 特徵抽取API (Sklearn.feature_extraction)

字典特徵抽取

  • sklearn.feature_extraction.DictVectorizer
  • 把字典中的一些類別數據,分別進行轉換成特徵;數值型(浮點型)不會進行轉化。
  • 數組形式,有類別的這些特徵,先要轉換字典數據
  1. fit_transform (直接接收字典)
from sklearn.feature_extraction import DictVectorizer


def dictver():
    """
    字典數據抽取
    :return:None
    """
    # 實例化
    dict = DictVectorizer(sparse=False)
    # 調用fit_transform
    data = dict.fit_transform(
        [{'city': '北京', 'temperature': 100},
         {'city': '上海', 'temperature': 60},
         {'city': '深圳', 'temperature': 30}])

    print(dict.get_feature_names())
    print(dict.inverse_transform(data))
    print(data)
    return None


if __name__ == '__main__':
    dictver()

```mysql

  1. sparse矩陣 - 方便節約內存
  • (0,1)- 行列座標 ; 1.0 - 值
  1. One-hot 編碼
  • 每一個類別生成一個布爾列,這些列中只有一列能夠爲每一個樣本取值1,便於機器學習數值分析。
  • 避免對每一個類別生成編碼是,1,2,3這種的會存在大小關係。

文本的特徵抽取(數量)

  • sklearn.feature_extraction.text.CountVectorizer
  • 文本分類,情感分析
  • 對於單個英文字母不統計:不反應主題,沒有情感依據
  1. 英文文本特徵抽取
def countvec():
    """
    對文本進行特徵值化
    :return:None
    """
    cv = CountVectorizer()
    data = cv.fit_transform(['life is short, i like python','life is too long, i dislike python'])
    print(cv.get_feature_names())
    # print(cv.inverse_transform(data))
    print(data.toarray())
    return None


if __name__ == '__main__':
    countvec()

英文文本特徵抽取

  • 統計全部文章當中全部的詞,重複的只看作一次
  • 對每篇文章,在詞的列表裏面進行統計每一個詞出現的次數
  • 單個字母不統計
  1. 中文文本
  • 須要對中文進行分詞才能詳細的進行特徵值化
  • 不支持單箇中文字
  • 使用 jieba這個模塊 - jieba.cut('我是一個好程序員')
import jieba
from sklearn.feature_extraction.text import CountVectorizer

def cutword():
    """
    中文字分割
    :return: c1, c2, c3
    """
    con1 = jieba.cut('今天很殘酷,明天更殘酷,後天很美好,'
                     '但絕對大多數是死在明天晚上,因此每一個人不要放棄今天')
    con2 = jieba.cut('咱們看到的從很遠星系來的光是在幾百萬年前發出的,'
                     '這樣當咱們看到宇宙時,咱們是在看它的過去')
    con3 = jieba.cut('若是隻用一種方式瞭解某樣事物,你就不會真正的瞭解它。'
                     '瞭解事物真正含義的祕密取決於如何將其與咱們所瞭解的事物相聯繫')

    # 轉換成列表
    content1 = list(con1)
    content2 = list(con2)
    content3 = list(con3)

    # 把列表轉換成字符串
    # join(iterable) 以指定字符串做爲分隔符,將content1中全部元素合併成一個新的字符串
    c1 = ' '.join(content1)
    c2 = ' '.join(content2)
    c3 = ' '.join(content3)

    return c1, c2, c3


def hanzivec():
    """
    中文特徵值化
    :return: None
    """
    c1, c2, c3 = cutword()
    cv = CountVectorizer()  # 實例化
    data = cv.fit_transform([c1, c2, c3])
    print(cv.get_feature_names())
    print(data.toarray())


if __name__ == '__main__':
    hanzivec()

文本特徵抽取(語義)

  1. tf - idf (tf * idf) 重要性程度
  • tf: term frequency (詞的頻率)
  • idf: inverse document frequency (逆文檔頻率) log(總文檔數量/該詞出現的文檔數量)
  1. TF-IDF: 若是某個詞或者短語在一篇文章中出現的機率高,而且在其餘文章中不多出現,則認爲此詞或短語具備很好的類別區分能力,適合用來分類。程序員

  2. sklearn.feature_extraction.text.TfidfVectorizer
    TfidfVectorizer語法算法

import jieba
from sklearn.feature_extraction.text import TfidfVectorizer

def cutword():
    """
    中文字分割
    :return: c1, c2, c3
    """
    con1 = jieba.cut('今天很殘酷,明天更殘酷,後天很美好,'
                     '但絕對大多數是死在明天晚上,因此每一個人不要放棄今天')
    con2 = jieba.cut('咱們看到的從很遠星系來的光是在幾百萬年前發出的,'
                     '這樣當咱們看到宇宙時,咱們是在看它的過去')
    con3 = jieba.cut('若是隻用一種方式瞭解某樣事物,你就不會真正的瞭解它。'
                     '瞭解事物真正含義的祕密取決於如何將其與咱們所瞭解的事物相聯繫')

    # 轉換成列表
    content1 = list(con1)
    content2 = list(con2)
    content3 = list(con3)

    # 把列表轉換成字符串
    # join(iterable) 以指定字符串做爲分隔符,將content1中全部元素合併成一個新的字符串
    c1 = ' '.join(content1)
    c2 = ' '.join(content2)
    c3 = ' '.join(content3)

    return c1, c2, c3


def hanzivec():
    """
    中文特徵值化
    :return: None
    """
    c1, c2, c3 = cutword()
    tf = TfidfVectorizer()  # 實例化
    data = tf.fit_transform([c1, c2, c3])
    print(tf.get_feature_names())
    print(data.toarray())


if __name__ == '__main__':
    hanzivec()
相關文章
相關標籤/搜索