1. 程式人生 > 實用技巧 >機器學習進度01(sklearn、字典特徵抽取、文字特徵抽取(CountVectorizer、TfidfVevtorizer)、中文文字特徵抽取)

機器學習進度01(sklearn、字典特徵抽取、文字特徵抽取(CountVectorizer、TfidfVevtorizer)、中文文字特徵抽取)

sklearn資料集

1 scikit-learn資料集API介紹

  • sklearn.datasets
    • 載入獲取流行資料集
    • datasets.load_*()
      • 獲取小規模資料集,資料包含在datasets裡
    • datasets.fetch_*(data_home=None)
      • 獲取大規模資料集,需要從網路上下載,函式的第一個引數是data_home,表示資料集下載的目錄,預設是 ~/scikit_learn_data/

2 sklearn小資料集

  • sklearn.datasets.load_iris()

    載入並返回鳶尾花資料集

  • sklearn.datasets.load_boston()

    載入並返回波士頓房價資料集

3 sklearn大資料集

  • sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)
    • subset:'train'或者'test','all',可選,選擇要載入的資料集。
    • 訓練集的“訓練”,測試集的“測試”,兩者的“全部”

4 sklearn資料集的使用

  • 以鳶尾花資料集為例:

sklearn資料集返回值介紹

  • load和fetch返回的資料型別datasets.base.Bunch(字典格式)
    • data:特徵資料陣列,是 [n_samples * n_features] 的二維 numpy.ndarray 陣列
    • target:標籤陣列,是 n_samples 的一維 numpy.ndarray 陣列
    • DESCR:資料描述
    • feature_names:特徵名,新聞資料,手寫數字、迴歸資料集沒有
    • target_names:標籤名
from sklearn.datasets import load_iris
def datasets_demo():
# 獲取鳶尾花資料集
    iris = load_iris()
    print("鳶尾花資料集的返回值:\n", iris)
    # 返回值是一個繼承自字典的Bench
    print("鳶尾花的特徵值:\n", iris["data"])
    print(
"鳶尾花的目標值:\n", iris.target) print("鳶尾花特徵的名字:\n", iris.feature_names) print("鳶尾花目標值的名字:\n", iris.target_names) print("鳶尾花的描述:\n", iris.DESCR) if __name__=="__main__": datasets_demo()

資料集的劃分

機器學習一般的資料集會劃分為兩個部分:

  • 訓練資料:用於訓練,構建模型
  • 測試資料:在模型檢驗時使用,用於評估模型是否有效

劃分比例:

  • 訓練集:70% 80% 75%
  • 測試集:30% 20% 30%

資料集劃分api

  • sklearn.model_selection.train_test_split(arrays, *options)
    • x 資料集的特徵值
    • y 資料集的標籤值
    • test_size 測試集的大小,一般為float
    • random_state 隨機數種子,不同的種子會造成不同的隨機取樣結果。相同的種子取樣結果相同。
    • return 測試集特徵訓練集特徵值值,訓練標籤,測試標籤(預設隨機取)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
def datasets_demo():
# 獲取鳶尾花資料集
iris = load_iris()
#print("鳶尾花資料集的返回值:\n", iris)
# 返回值是一個繼承自字典的Bench
#print("鳶尾花的特徵值:\n", iris["data"])
#print("鳶尾花的目標值:\n", iris.target)
#print("鳶尾花特徵的名字:\n", iris.feature_names)
#print("鳶尾花目標值的名字:\n", iris.target_names)
#print("鳶尾花的描述:\n", iris.DESCR)
#進行資料及的劃分
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.2,random_state=22)
#test_size預設是0.25,random_state表示隨機數種子
print("訓練集得特徵值 :\n",x_train,x_train.shape)#x_train.shape看x_train有多少行多少咧
#隨機種子一種之後所有的項都是true

if __name__=="__main__":
datasets_demo()

字典特徵抽取:

將任意資料(如文字或影象)轉換為可用於機器學習的數字特徵

特徵工程是使用專業背景知識和技巧處理資料,使得特徵能在機器學習演算法上發揮更好的作用的過程。

  • 意義:會直接影響機器學習的效果,資料和特徵決定了機器學習的上限,而模型和演算法只是逼近這個上限而已。
  • pandas:一個數據讀取非常方便以及基本的處理格式的工具
  • sklearn:對於特徵的處理提供了強大的介面

特徵抽取的目標:

  • 應用DictVectorizer實現對類別特徵進行數值化、離散化
  • 應用CountVectorizer實現對文字特徵進行數值化
  • 應用TfidfVectorizer實現對文字特徵進行數值化
  • 說出兩種文字特徵提取的方式區別

特徵提取API

sklearn.feature_extraction

作用:對字典資料進行特徵值化

  • sklearn.feature_extraction.DictVectorizer(sparse=True,…)
    • DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器返回值:返回sparse矩陣
    • DictVectorizer.inverse_transform(X) X:array陣列或者sparse矩陣 返回值:轉換之前資料格式
    • DictVectorizer.get_feature_names() 返回類別名稱

對於特徵當中存在類別資訊的我們都會做one-hot編碼處理

#字典特徵提取
def dict_demo():
    """
    對字典型別的資料進行特徵抽取
    :return: None
    """
    data = [{'city': '北京','temperature':100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]
    # 1、例項化一個轉換器類
    transfer = DictVectorizer(sparse=False)
    # 2、呼叫fit_transform
    data = transfer.fit_transform(data)
    print("返回的結果:\n", data)
    # 列印特徵名字
    print("特徵名字:\n", transfer.get_feature_names())
    return None

if __name__=="__main__":
    dict_demo()

文字特徵提取CountVectorizer:

作用:對文字資料進行特徵值化

  • sklearn.feature_extraction.text.CountVectorizer(stop_words=[])

    • 返回詞頻矩陣
  • CountVectorizer.fit_transform(X) X:文字或者包含文字字串的可迭代物件 返回值:返回sparse矩陣
  • CountVectorizer.inverse_transform(X) X:array陣列或者sparse矩陣 返回值:轉換之前資料格
  • CountVectorizer.get_feature_names() 返回值:單詞列表
  • sklearn.feature_extraction.text.TfidfVectorizer#文字特徵提取
def text_count_demo():
    """
    對文字進行特徵抽取,countvetorizer
    :return: None
    """
    data = ["life is short,i like like python", "life is too long,i dislike python"]
    # 1、例項化一個轉換器類
    transfer = CountVectorizer()
    #transfer = CountVectorizer(stop_words=["is","too"])#設定停用詞表,這樣就不管這些單詞了
    # 2、呼叫fit_transform
    data = transfer.fit_transform(data)
    #統計的是單詞出現的個數
    print("文字特徵抽取的結果:\n", data.toarray())#採用toarray()進行展示
    print("返回特徵名字:\n", transfer.get_feature_names())
    return None

if __name__=="__main__":
    text_count_demo()

中文文字特徵提取:

簡單(手動分開一個句子)。

#中文文字特徵提取
def count_chinese_demo():
    """
    對中文文字進行特徵抽取,
    :return: None
    """
    data = ["人生 苦短,我 喜歡 Python","生活 太長久,我不 喜歡 Python"]
    # 1、例項化一個轉換器類
    transfer = CountVectorizer()
    # 2、呼叫fit_transform
    data = transfer.fit_transform(data)
    #統計的是單詞出現的個數
    print("文字特徵抽取的結果:\n", data.toarray())#採用toarray()進行展示
    print("返回特徵名字:\n", transfer.get_feature_names())
    return None
if __name__=="__main__":
    count_chinese_demo()

jieba自動分詞:

#jieba分詞
def cut_word(text):
    """
    對中文進行分詞
    "我愛北京天安門"————>"我 愛 北京 天安門"
    :param text:
    :return: text
    """
    # 用結巴對中文字串進行分詞
    text = " ".join(list(jieba.cut(text)))#用list將他強轉一下使用“ ”.json就會將他變成字串
    return text

#中文文字特徵提取jieba分詞
def count_chinese_demo2():
    """
        對中文進行特徵抽取
        :return: None
        """
    data = ["一種還是一種今天很殘酷,明天更殘酷,後天很美好,但絕對大部分是死在明天晚上,所以每個人不要放棄今天。",
            "我們看到的從很遠星系來的光是在幾百萬年之前發出的,這樣當我們看到宇宙時,我們是在看它的過去。",
            "如果只用一種方式瞭解某樣事物,你就不會真正瞭解它。瞭解事物真正含義的祕密取決於如何將其與我們所瞭解的事物相聯絡。"]
    # 將原始資料轉換成分好詞的形式
    text_list = []
    for sent in data:
        text_list.append(cut_word(sent))
    print(text_list)
    # 1、例項化一個轉換器類
    transfer = CountVectorizer()
    # 2、呼叫fit_transform
    data = transfer.fit_transform(text_list)
    print("文字特徵抽取的結果:\n", data.toarray())
    print("返回特徵名字:\n", transfer.get_feature_names())
    return None

if __name__=="__main__":
    count_chinese_demo2()

文字特徵提取TfidfVevtorizer:

其衡量的是一個單詞的重要程度。

  • TF-IDF的主要思想是:

  • 如果某個詞或短語在一篇文章中出現的概率高,並且在其他文章中很少出現,則認為此詞或者短語具有很好的類別區分能力,適合用來分類。
  • TF-IDF作用:

  • 用以評估一字詞對於一個檔案集或一個語料庫中的其中一份檔案的重要程度

公式

  • 詞頻(term frequency,tf)指的是某一個給定的詞語在該檔案中出現的頻率
  • 逆向文件頻率(inverse document frequency,idf)是一個詞語普遍重要性的度量。某一特定詞語的idf,可以由總檔案數目除以包含該詞語之檔案的數目,再將得到的商取以10為底的對數得到

#文字特徵提取tfidf
def text_chinese_tfidf_demo():
    """
    對文字進行特徵抽取-tfidf
    :return: None
    """
    data = ["一種還是一種今天很殘酷,明天更殘酷,後天很美好,但絕對大部分是死在明天晚上,所以每個人不要放棄今天。",
            "我們看到的從很遠星系來的光是在幾百萬年之前發出的,這樣當我們看到宇宙時,我們是在看它的過去。",
            "如果只用一種方式瞭解某樣事物,你就不會真正瞭解它。瞭解事物真正含義的祕密取決於如何將其與我們所瞭解的事物相聯絡。"]
    # 將原始資料轉換成分好詞的形式
    text_list = []
    for sent in data:
        text_list.append(cut_word(sent))
    print(text_list)
    # 1、例項化一個轉換器類
    transfer = TfidfVectorizer(stop_words=['一種', '不會', '不要'])
    # 2、呼叫fit_transform
    data = transfer.fit_transform(text_list)
    print("文字特徵抽取的結果:\n", data.toarray())
    print("返回特徵名字:\n", transfer.get_feature_names())

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