機器學習進階 第一節 第二課
Scikit-learn 庫

概述
安裝
特征抽取
sklearn 特征抽取 API
字典特征抽取
DictVectorizer 語法
流程
文本特征抽取
CountVectorizer 語法
流程
案例
TF-IDF
Tf
Idf
公式
TfidfVectorizer 語法
流程
概述
Scikit-learn 庫是 Python 語言的機器學習工具, 包括許多知名的機器學習算法的實現. Scikit-learn 文檔完善, 容易上手, 有豐富的 API, 使其在學術界頗受歡迎. 目前穩定版本 0.23.
安裝
創建一個機遇 Python3 的虛擬環境: (可以在你自己已有的虛擬環境中)
mkvirtualenv -p /user/bin/python3.5 ml3
1
然后通過導入命令查看是否可以使用:
import sklearn
1
注: 安裝 scikit-learn 需要 Numpy, pandas 等庫.
特征抽取
# 導入包 from sklearn.feature_extraction.text import CountVectorizer # 實例化CountVectorizer() vector = CountVectorizer() # 調用fit_transform輸入并轉換數據 txt = ["life is short, I like Pyhton","life is too long, I dislike python"] res = vector.fit_transform(txt) # 調試輸出 print(vector.get_feature_names()) print(res.toarray()) 輸出結果: ['dislike', 'is', 'life', 'like', 'long', 'pyhton', 'python', 'short', 'too'] [[0 1 1 1 0 1 0 1 0] [1 1 1 0 1 0 1 0 1]]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
通過上述代碼, 我們可以得出結論: 特征抽取對文本等數據進行特征值化.
注: 特征值化是為了計算機更好的去理解數據.
sklearn 特征抽取 API
sklearn.feature_extraction
字典特征抽取
字典特征抽取: 對字典數據進行特征值化.
類: sklearn.feature_extraction.DictVectorizer
DictVectorizer 語法
DictVectorizer(sparse=True,...)
1
DictVectorizer.fit_transform(X)
X: 字典或包含字典的迭代器
返回值: 返回 sparse 矩陣
DicVectorizer.inverse_transform(X)
X: array 數組或者 sparse 矩陣
返回值: 轉換之前數據格式
DictVectorizer.get_future_names()
返回類別名稱
DictVectorizer.transform(X)
按照原先的標準轉換
流程
實例化類 DictVectorizer
調用 fit_transform 方法輸入數據并轉換 (注意返回格式)
from sklearn.feature_extraction import DictVectorizer def dictvec(): """ 字典數據抽取 :return: None """ # 實例化 dict = DictVectorizer() # 調用fit_transform txt = [{"city":"北京","temperature":100},{"city":"上海","temperature":60},{"city":"深圳","temperature":30}] data = dict.fit_transform(txt) # 調試輸出 print(data) return None if __name__ == "__main__": dictvec() 輸出結果: (0, 1) 1.0 (0, 3) 100.0 (1, 0) 1.0 (1, 3) 60.0 (2, 2) 1.0 (2, 3) 30.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
設置 sparse=Flase
# 實例化 dict = DictVectorizer(sparse=False)
1
2
輸出結果:
[[ 0. 1. 0. 100.] [ 1. 0. 0. 60.] [ 0. 0. 1. 30.]]
1
2
3
特征抽取:
from sklearn.feature_extraction import DictVectorizer def dictvec(): """ 字典數據抽取 :return: None """ # 實例化 dict = DictVectorizer() # 調用fit_transform txt = [{"city":"北京","temperature":100},{"city":"上海","temperature":60},{"city":"深圳","temperature":30}] data = dict.fit_transform(txt) # 調試輸出 print(dict.get_feature_names()) print(data) return None if __name__ == "__main__": dictvec() 輸出結果: ['city=上海', 'city=北京', 'city=深圳', 'temperature'] (0, 1) 1.0 (0, 3) 100.0 (1, 0) 1.0 (1, 3) 60.0 (2, 2) 1.0 (2, 3) 30.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
文本特征抽取
文本特征抽取: 對文本數據進行特征值化.
類: sklearn.feature_extraction.text.CountVectorizer
CountVectorizer 語法
CountVectorizer(): 返回詞頻矩陣
1
CountVectorizer.fit_transform(X)
X: 文本或者包含文本字符串的可迭代對象
返回值: 返回 sparse 矩陣
CountVectorizer.inverse_reansform(X)
X: array 數組或者 sparse 矩陣
返回值: 轉換之前數據格式
CountVectorizer.get_future_names()
返回值: 單詞列表
流程
實例化類 CountVectorizer
調用 fit_transform 方法輸入數據并轉換 (注意返回格式)
注意返回格式, 利用 toarray() 進行 sparse 矩陣轉換 array 數組
from sklearn.feature_extraction.text import CountVectorizer def countvec(): """ 對文本進行特征值化 :return: None """ # 實例化 cv = CountVectorizer() txt = ["life is short, I like Pyhton", "life is too long, I dislike python"] data = cv.fit_transform(txt) # 調試輸出 print(cv.get_feature_names()) print(data.toarray()) return None if __name__ == "__main__": countvec() 輸出結果: ['dislike', 'is', 'life', 'like', 'long', 'pyhton', 'python', 'short', 'too'] [[0 1 1 1 0 1 0 1 0] [1 1 1 0 1 0 1 0 1]]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
案例
對三段話進行特征值化
今天很殘酷, 明天更殘酷, 后天很美好. 但絕大部分是死在明天晚上, 所以每個人不要放棄今天
我們看到的從很遠星系來的光是在幾百萬年之前發出去的. 這樣當我們看到宇宙時, 我們是在看它的過去
如果只用一種方式了解某樣事物, 你就不會真正了解它. 了解事物真正含義的秘密取決于如何將其我們所了解的事物相聯系
from sklearn.feature_extraction.text import CountVectorizer import jieba def cutword(): text1 = "今天很殘酷, 明天更殘酷, 后天很美好. 但絕大部分是死在明天晚上, 所以每個人不要放棄今天." text2 = "我們看到的從很遠星系來的光是在幾百萬年之前發出去的. 這樣當我們看到宇宙時, 我們是在看它的過去." text3 = "如果只用一種方式了解某樣事物, 你就不會真正了解它. 了解事物真正含義的秘密取決于如何將其我們所了解的事物相聯系." con1 = jieba.cut(text1) con2 = jieba.cut(text2) con3 = jieba.cut(text3) # 轉換成列表 content1 = list(con1) content2 = list(con2) content3 = list(con3) # 把列表轉換成字符串 c1 = " ".join(content1) c2 = " ".join(content2) c3 = " ".join(content3) return c1, c2, c3 def hanzivec(): """ 中文特征值化 :return: None """ # 分詞 c1, c2, c3 = cutword() # 實例化 cv = CountVectorizer() txt = [c1, c2, c3] data = cv.fit_transform(txt) # 調試輸出 print(cv.get_feature_names()) print(data.toarray()) return None if __name__ == "__main__": hanzivec() 輸出結果: ['一種', '不會', '不要', '之前', '了解', '事物', '今天', '光是在', '幾百萬年', '發出', '取決于', '只用', '后天', '含義', '如何', '如果', '宇宙', '我們', '所以', '放棄', '方式', '明天', '星系', '晚上', '某樣', '殘酷', '每個', '看到', '真正', '秘密', '絕大部分', '美好', '聯系', '過去', '這樣'] [[0 0 1 0 0 0 2 0 0 0 0 0 1 0 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 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 1 1 0 1 0 0 1 0 0 0 1 0 0 0 2 1 0 0 1 0 0]]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
TF-IDF
TF-IDF 的主要思想是: 如果某個詞或短語在一篇文章中出現的概率高, 并且在其他文章中很少出現, 則認為此次或者短語具有很好的類別區分能力, 適合用來分類.
TF-IDF 作用: 用以評估一詞對于一個文件集或一個語料庫中的其中一份文件的重要程度.
類: sklearn.feature_extraction.text.TfidfVectorizer
Tf
Tf: term frequency (詞的頻率)
Idf
Idf: inverse document frequency (逆文檔頻率)
公式
log(總文檔數量 / 該詞出現的文檔數量)
TfidfVectorizer 語法
TfidfVectorizer(stop_word=None,...) 返回詞的權重矩陣
1
TfidVectorizer.fit_transform(X)
X: 文本返回或者包含文本字符串的可迭代對象
返回值: 返回 spare 矩陣
TfidVectorizer.inverse_transfrom(X)
X: array 數組或者 sparse 矩陣
返回值: 裝換之前數據格式
TfidfVectorizer.get_feature_names()
返回值: 單詞列表
流程
為什么需要 TfidVectorizer ?
分類機器學習算法的重要依據
代碼展示:
from sklearn.feature_extraction.text import TfidfVectorizer import jieba def cutword(): text1 = "今天很殘酷, 明天更殘酷, 后天很美好. 但絕大部分是死在明天晚上, 所以每個人不要放棄今天." text2 = "我們看到的從很遠星系來的光是在幾百萬年之前發出去的. 這樣當我們看到宇宙時, 我們是在看它的過去." text3 = "如果只用一種方式了解某樣事物, 你就不會真正了解它. 了解事物真正含義的秘密取決于如何將其我們所了解的事物相聯系." con1 = jieba.cut(text1) con2 = jieba.cut(text2) con3 = jieba.cut(text3) # 轉換成列表 content1 = list(con1) content2 = list(con2) content3 = list(con3) # 把列表轉換成字符串 c1 = " ".join(content1) c2 = " ".join(content2) c3 = " ".join(content3) return c1, c2, c3 def hanzivec(): """ 中文特征值化 :return: None """ # 分詞 c1, c2, c3 = cutword() # 實例化 tv = TfidfVectorizer() txt = [c1, c2, c3] data = tv.fit_transform(txt) # 調試輸出 print(tv.get_feature_names()) print(data.toarray()) return None if __name__ == "__main__": hanzivec() 輸出結果: ['一種', '不會', '不要', '之前', '了解', '事物', '今天', '光是在', '幾百萬年', '發出', '取決于', '只用', '后天', '含義', '如何', '如果', '宇宙', '我們', '所以', '放棄', '方式', '明天', '星系', '晚上', '某樣', '殘酷', '每個', '看到', '真正', '秘密', '絕大部分', '美好', '聯系', '過去', '這樣'] [[0. 0. 0.2236068 0. 0. 0. 0.4472136 0. 0. 0. 0. 0. 0.2236068 0. 0. 0. 0. 0. 0.2236068 0.2236068 0. 0.4472136 0. 0.2236068 0. 0.4472136 0.2236068 0. 0. 0. 0.2236068 0.2236068 0. 0. 0. ] [0. 0. 0. 0.2410822 0. 0. 0. 0.2410822 0.2410822 0.2410822 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.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. ]]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
機器學習
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。