ML算法基礎——概述、特徵工程(特徵抽取)

1、機器學習概述

**什麼是機器學習 **

機器學習是從數據中自動分析獲得規律(模型),並利用規律對未知數據進行預測

爲什麼需要機器學習
解放生產力(智能客服)
解決專業問題(ET醫療)
提供社會便利(城市大腦)

機器學習的應用場景
自然語言處理
無人駕駛
計算機視覺
推薦系統

2、數據來源與類型

  • 來源
    企業日益積累的大量數據(互聯網公司更爲顯著)
    政府掌握的各種數據
    科研機構的實驗數據
  • 類型
    (1)離散型數據:由記錄不同類別個體的數目所得到的數據,又稱計數數據,所
    有這些數據全部都是整數,而且不能再細分,也不能進一步提高他
    們的精確度。
    (2)連續型數據:變量可以在某個範圍內取任一數,即變量的取值可以是連續
    的,如,長度、時間、質量值等,這類整數通常是非整數,含有小數
    部分。
    :離散型是區間內不可分,連續型是區間內可分

3、數據的特徵工程

3.1 特徵工程概況

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

特徵工程直接影響模型的預測結果

3.2 scikit-learn庫介紹

Python語言的機器學習工具
Scikit-learn包括許多知名的機器學習算法的實現
Scikit-learn文檔完善,容易上手,豐富的API,使其在學術界頗受歡迎。

  • 安裝
pip3 install Scikit-learn

3.4 數據的特徵抽取

3.4.1 特徵抽取實例演示

# 特徵抽取
#
# 導入包
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())
>>>
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
[[0 1 1 1 0 1 1 0]
 [1 1 1 0 1 1 0 1]]

特徵抽取針對非連續型數據

特徵抽取對文本等進行特徵值化

注:特徵值化是爲了計算機更好的去理解數據

3.4.2 sklearn特徵抽取API

Application Programming Interface 應用編程接口

sklearn.feature_extraction

3.4.3 字典特徵抽取(特徵值化、one-hot編碼)

對字典數據進行特徵值化

sklearn.feature_extraction.DictVectorizer

(1)DictVectorizer語法

  • DictVectorizer.fit_transform(X)
    • X:字典或者包含字典的迭代器
    • 返回值:返回sparse矩陣
  • DictVectorizer.inverse_transform(X)
    • X:array數組或者sparse矩陣
    • 返回值:轉換之前數據格式
  • DictVectorizer.get_feature_names()
    • 返回類別名稱
  • DictVectorizer.transform(X)
    • 按照原先的標準轉換

(2)流程

實例化類DictVectorizer

調用fit_transform方法輸入數據並轉換注意返回格式

# 導入包
from sklearn.feature_extraction import DictVectorizer
def dictvec():
    #實例化
    dict=DictVectorizer()
    data=dict.fit_transform([{'city': '北京','temperature':100},
{'city': '上海','temperature':60},
{'city': '深圳','temperature':30}]
)
    print(data)
    return None

if __name__ == "__main__":
    dictvec()
>>> #默認返回sparse矩陣
(0, 1)	1.0
  (0, 3)	100.0
  (1, 0)	1.0
  (1, 3)	60.0
  (2, 2)	1.0
  (2, 3)	30.0

dict=DictVectorizer(sparse=False),結果:(ndarray,數組)

[[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]]

print(dict.get_feature_names())

['city=上海', 'city=北京', 'city=深圳', 'temperature']

字典數據抽取:把字典中一些類別的數據,分別轉化成特徵

(3)one-hot編碼分析
將有類別的特徵轉化成one-hot編碼形式,有利於數據的處理
image
圖片引用自:https://www.cnblogs.com/shuaishuaidefeizhu/p/11269257.html

3.4.4 文本特徵抽取(特徵值化、jieba、TF-IDF)

對文本數據進行特徵值化
sklearn.feature_extraction.text.CountVectorizer
(1)CountVectorizer語法

  • CountVectorizer(max_df=1.0,min_df=1,…)
    • 返回詞頻矩陣
  • CountVectorizer.fit_transform(X,y)
    • X:文本或者包含文本字符串的可迭代對象
    • 返回值:返回sparse矩陣
  • CountVectorizer.inverse_transform(X)
    • X:array數組或者sparse矩陣
    • 返回值:轉換之前數據格式
  • CountVectorizer.get_feature_names()
    • 返回值:單詞列表

實例:

from sklearn.feature_extraction.text import CountVectorizer
def countvec():
    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(data.toarray()) #對每篇文章,在詞的列表裏進行統計每個詞出現的次數,單個字母不統計
    return None

countvec()

>>>
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
[[0 1 1 1 0 1 1 0]
 [1 1 1 0 1 1 0 1]]

單個字母不統計,因爲:沒有分類依據
中文也可以進行處理,但是不會自動分詞,可以調用jieba

(2)jieba分詞
案例:對三段話進行特徵值化

1、今天很殘酷,明天更殘酷,後天很美好,
但絕對大部分是死在明天晚上,所以每個人不要放棄今天。
2、我們看到的從很遠星系來的光是在幾百萬年之前發出的,
這樣當我們看到宇宙時,我們是在看它的過去。
3、如果只用一種方式瞭解某樣事物,你就不會真正瞭解它。
瞭解事物真正含義的祕密取決於如何將其與我們所瞭解的事物相聯繫。

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(content1)
    c2 = ' '.join(content2)
    c3 = ' '.join(content3)
    print(con1) #返回值:詞語生成器
    print(content1)
    print(c1)
    return c1,c2,c3

def hanzivec():

    c1,c2,c3=cutword()
    cv = CountVectorizer()
    data = cv.fit_transform([c1,c2,c3])
    print(cv.get_feature_names())
    print(data.toarray())

    return None

if __name__ == "__main__":
    hanzivec()

>>>
<generator object Tokenizer.cut at 0x0000017B4C322CF0>
['今天', '很', '殘酷', ',', '明天', '更', '殘酷', ',', '後天', '很', '美好', ',', '但', '絕對', '大部分', '是', '死', '在', '明天', '晚上', ',', '所以', '每個', '人', '不要', '放棄', '今天', '。']
今天 很 殘酷 , 明天 更 殘酷 , 後天 很 美好 , 但 絕對 大部分 是 死 在 明天 晚上 , 所以 每個 人 不要 放棄 今天 。
['一種', '不會', '不要', '之前', '瞭解', '事物', '今天', '光是在', '幾百萬年', '發出', '取決於', '只用', '後天', '含義', '大部分', '如何', '如果', '宇宙', '我們', '所以', '放棄', '方式', '明天', '星系', '晚上', '某樣', '殘酷', '每個', '看到', '真正', '祕密', '絕對', '美好', '聯繫', '過去', '這樣']
[[0 0 1 0 0 0 2 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 2 0 1 0 2 1 0 0 0 1 1 0 0 0]
 [0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 3 0 0 0 0 1 0 0 0 0 2 0 0 0 0 0 1 1]
 [1 1 0 0 4 3 0 0 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 1 0 0 0 2 1 0 0 1 0 0]]

(3)TF-IDF
TF-IDF的主要思想是:如果某個詞或短語在一篇文章中出現的概率高,並且在其他文章中很少出現,則認爲此詞或者短語具有很好的類別區分能力,適合用來分類。
分類機器學習算法的的重要依據
TF-IDF作用:用以評估一字詞對於一個文件集或一個語料庫中的其中一份文件的重要程度

類:sklearn.feature_extraction.text.TfidfVectorizer

TfidfVectorizer語法

  • TfidfVectorizer(stop_words=None,…)
    • 返回詞的權重矩陣
  • TfidfVectorizer.fit_transform(X,y)
    • X:文本或者包含文本字符串的可迭代對象
    • 返回值:返回sparse矩陣
  • TfidfVectorizer.inverse_transform(X)
    • X:array數組或者sparse矩陣
    • 返回值:轉換之前數據格式
  • TfidfVectorizer.get_feature_names()
    • 返回值:單詞列表

案例

def tfidfvec():
    c1, c2, c3 = cutword()
    print(c1, c2, c3)
    tf=TfidfVectorizer()
    data=tf.fit_transform([c1, c2, c3])
    print(tf.get_feature_names())
    print(data.toarray())
tfidfvec()
>>>
今天 很 殘酷 , 明天 更 殘酷 , 後天 很 美好 , 但 絕對 大部分 是 死 在 明天 晚上 , 所以 每個 人 不要 放棄 今天 。 我們 看到 的 從 很 遠 星系 來 的 光是在 幾百萬年 之前 發出 的 , 這樣 當 我們 看到 宇宙 時 , 我們 是 在 看 它 的 過去 。 如果 只用 一種 方式 瞭解 某樣 事物 , 你 就 不會 真正 瞭解 它 。 瞭解 事物 真正 含義 的 祕密 取決於 如何 將 其 與 我們 所 瞭解 的 事物 相 聯繫 。
['一種', '不會', '不要', '之前', '瞭解', '事物', '今天', '光是在', '幾百萬年', '發出', '取決於', '只用', '後天', '含義', '大部分', '如何', '如果', '宇宙', '我們', '所以', '放棄', '方式', '明天', '星系', '晚上', '某樣', '殘酷', '每個', '看到', '真正', '祕密', '絕對', '美好', '聯繫', '過去', '這樣']
[[0.         0.         0.21821789 0.         0.         0.
  0.43643578 0.         0.         0.         0.         0.
  0.21821789 0.         0.21821789 0.         0.         0.
  0.         0.21821789 0.21821789 0.         0.43643578 0.
  0.21821789 0.         0.43643578 0.21821789 0.         0.
  0.         0.21821789 0.21821789 0.         0.         0.        ]
 [0.         0.         0.         0.2410822  0.         0.
  0.         0.2410822  0.2410822  0.2410822  0.         0.
  0.         0.         0.         0.         0.         0.2410822
  0.55004769 0.         0.         0.         0.         0.2410822
  0.         0.         0.         0.         0.48216441 0.
  0.         0.         0.         0.         0.2410822  0.2410822 ]
 [0.15698297 0.15698297 0.         0.         0.62793188 0.47094891
  0.         0.         0.         0.         0.15698297 0.15698297
  0.         0.15698297 0.         0.15698297 0.15698297 0.
  0.1193896  0.         0.         0.15698297 0.         0.
  0.         0.15698297 0.         0.         0.         0.31396594
  0.15698297 0.         0.         0.15698297 0.         0.        ]]

Process finished with exit code 0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章