sklearn安裝
在linux或windows終端輸入
pip3 install Scikit-learn
安裝較慢則替換源
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
以下內容會用到sklearn的API接口,官網:https://scikit-learn.org/stable/modules/classes.html
字典特徵提取
sklearn可對字典進行特徵值化,如對一組人體數據進行特徵值化。
本例使用到了sklearn的API接口:sklearn.feature_extraction.DictVectorizer
from sklearn.feature_extraction import DictVectorizer
def dictVetor():
dict=DictVectorizer()
data=dict.fit_transform([{'身高':180,'體重':160,'頭髮長度':'short'},
{'身高':170,'體重':120,'頭髮長度':'short'},
{'身高':165,'體重':100,'頭髮長度':'long'}])
print(dict.get_feature_names())
print(data)
if __name__=="__main__":
dictVetor()
打印出的結果爲scipy提供的sparse稀疏矩陣,初看似乎看不出任何意義,下面看一下另一種輸出格式
將程序中dict=DictVectorizer()添加一個參數,dict=DictVectorizer(sparse=False),sparase=False將輸出numpy的ndarray矩陣
這樣看上去似乎清楚多了,DictVectorizer提取4個特徵值,體重,頭髮長度=long,頭髮長度=short,身高
輸出一個3*4的二維矩陣,3行對應我們提供的字典變量裏的三組值,4列對應四個特徵,第一行輸出體重,第二行輸出0/1,0代表不是長髮,1代表是長髮,第三行與第二行同質,第四行輸出身高
而頭髮長度=long,頭髮長度=short爲什麼要以01來表示,實際上是爲了解決內存空間,我們把它稱爲one-hot編碼
意義何在?
進行字典特徵提取的意義在與,其本質通過分析特徵來判斷一個目標值,以上面的例子來講,若體重較重,頭髮爲短髮,身高較高的一組數據,就更加符合男性的特徵,那麼它的目標值就應該爲男性,反正升高較矮,體重較輕,頭髮長度爲長髮的一組值就更加符合女性的特徵。
文本特徵提取
文本特徵提取是指對文本數據進行特徵值化,如以下這個實例,對一段文字進行特徵值化,將文本數據轉換爲特徵值,並統計出現的次數。
本例使用到了sklearn的API接口:sklearn.feature_extraction.text.CountVectorizer
from sklearn.feature_extraction.text import CountVectorizer
vector = CountVectorizer()
res=vector.fit_transform(["Sklearn is simple and efficient tools for predictive data analysis,"
"Accessible to everybody, "
"and reusable in various contexts,"
"Built on NumPy, SciPy, and matplotlib,"
"Open source, commercially usable - BSD license"])
print(vector.get_feature_names())
print(res.toarray())
對文本中出現的每一個單詞進行了小寫轉化並輸出個數。
意義何在?
進行文本特徵提取的意義何在呢?試想一下,對一段文字,我們通過特徵提取出每個單詞出現的次數,計算出在總單詞中的佔比,就可以對該篇文章的內容進行預測 ,比如出現較多的科技詞彙,那麼改變文章偏向於科技讀物類,若出現較多情感詞彙,那麼就偏向於情感類讀物,依次推類。
補充:中文文本提取思路
中文文本不同與英文文本,因爲英文每個單詞間有空格,非常適合提取,而中文的一段話是沒有空格的,使用sklearn直接進行提取會得到比較奇怪的特徵值,所以我們需要先對中文文本進行分詞,這裏推薦一個庫,庫名爲jieba,下面來看看使用效果。
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction import DictVectorizer
import jieba
vector = CountVectorizer()
#jieba默認返回迭代器對象,需轉換爲列表後再轉換爲字符串
c1=jieba.cut("男性,身高一米八,短頭髮,喜歡打球")
c2=jieba.cut("男性,身高一米七,短頭髮,喜歡唱歌")
c3=jieba.cut("女性,身高一米六,長頭髮,喜歡逛淘寶")
l1=list(c1)
l2=list(c2)
l3=list(c3)
str1="".join(l1)
str2="".join(l2)
str3="".join(l3)
res=vector.fit_transform([str1,str2,str3])
print(vector.get_feature_names())
print(res.toarray())
參考文檔:
特徵提取的目的:https://cloud.tencent.com/developer/news/369843
one-hot編碼:https://juejin.im/post/5d15840e5188255c23553204
稀疏矩陣庫scipy.sparse:https://blog.csdn.net/pipisorry/article/details/41762945
numpy ndarray:https://danzhuibing.github.io/py_numpy_ndarray.html