小白機器學習實用筆記
打算利用空餘時間學習python機器學習,通過寫文章的方式來記錄學習成果。持續更新中。。。。。
一.什麼是機器學習
機器學習是一種數據科學技術,它幫助計算機從現有數據中學習,從而預測未來的行爲、結果和趨勢
機器學習項目流程
1.根據原始數據明確問題,該做什麼
2.特徵工程
3找到合適算法,進行訓練預測
4模型的評估,判定效果
特徵工程三大步驟:特徵抽取、預處理、降維
1.特徵抽取:將文字、圖像等轉化爲數字
2.預處理:將數字轉化爲格式統一、符合規範的數值,並且減少特殊值
3.降維:進行數據的篩選,取出最有代表性的數據特徵
數據類型
· 散 型 數 據 : 由 記 錄 不 同 類 別 個 體 的 數 目 所 得 到 的 數 據 , 又 稱 計 數 數 據 , 所 有 這 些 數 據 全 部 都 是 整 數 , 而 且 不 能 再 細 分 , 也 不 能 進 一 步 提 高 他 們 的 精 確 度 。
· 連 續 型 數 據 : 變 量 可 以 在 某 個 範 圍 內 取 任 一 數 , 即 變 量 的 取 值 可 以 是 連 續 的 , 如 , 長 度 、 時 間 、 質 量 值 等 , 這 類 整 數 通 常 是 非 整 數 , 含 有 小 數 部 分 。
數據集
數據集的組成爲 特徵值+目標值
特徵值就是已有數據,目標值就是要預測(分類)的目標
監督學習與無監督學習
監督學習:有目標值+特徵值(特徵值爲已有數據,目標值爲預測數據)
無監督學習:沒有目標值,只有特徵值
分類:目標值爲離散型,分類最基本是二分類。
迴歸:目標值爲連續性
二.用sklearn對特徵進行提取(特徵抽取)
scikit-learn 是基於 Python 語言的機器學習工具
簡單高效的數據挖掘和數據分析工具
1: 字典的文字特徵提取
- 調用:from sklearn.feature_extraction import DictVectorizer
- 作用:能夠對字典進行特徵的提取
- 代碼實現
dic=DictVectorizer()
data=dic.fit_transform([{
'city':'北京','temperature':100},{
'city':'上海','temperature':60},{
'city':'深圳','temperature':30}])
print(data)
輸出:
這是one-hot方式編碼的sparse矩陣,有節約內存的優點
可以通過調整參數sparse=False來輸出數組
2:count方式提取文字特徵
- 調用:from sklearn.feature_extraction.text import CountVectorizer
- 作用:對句子或者段落進 行特徵提取,能夠對目標的詞語出現次數記錄,作爲句子的特點
注意:
1.英文不需要分段,因爲每個單詞之間有空格
2.中文要用jieba庫,將漢字進行分段,對每個詞語都會進行空格分割,否則無法識別哪個爲一組詞(英文沒有這個問題)
3.Jieba.cut()即可返回的是元祖,需要用list()轉爲列表,再.join爲字符串 - 代碼實現(英文):
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())#沒有sparse=False設置,所以需要用toarray方式輸出數組
- 輸出:
在上列的輸出中,代表着下列特徵值0,1對應的特徵名,每一組數據有該特徵,對應1,沒有該特徵,對應0 - 代碼實現(中文):
atext= jieba.cut ( "山有木兮未有枝,心悅君兮君不知,有種種吸引力、感召力,神祕感迫使心靈不斷地靠近,隨着迷霧的不斷解開,那層面紗不復存在,變得習以爲常,漸漸地進行疏遠,爲何如此傷心?是自我不夠堅定還是心靈難達境界,讓我獨自傷心,滿心的希望、不捨與留戀,現如今變得冷漠、傷心、無奈" )
btext= jieba.cut ('在對的時間遇到對的人,是一種緣分')
ctext= jieba.cut("在錯的時間遇到錯的人,是一種殘忍")
#轉換爲列表Jieba.cut()只可返回的是元祖,需要用list()轉爲列表,再.join爲字符串
aa=list(atext)
bb=list(btext)
cc=list(ctext)
#用空格將他們再變連爲字符串
t1 = ' '.join ( aa )
t2 = ' '.join ( bb )
t3 = ' '.join ( cc )#t3:在 錯 的 時間 遇到 錯 的 人 , 是 一種 殘忍
cv = CountVectorizer ()
data = cv.fit_transform ( [t1,t2,t3] )
print ( cv.get_feature_names () )
print ( data.toarray () )
- 輸出:
3:tf-idf對文字特徵提取
對於文本特徵識別,什麼詞出現在其他文章中越少,越有代表性
TF-IDF的主要思想是:如果某個詞或者短語在一篇文章中出現的頻率高,並且在其他文章中很少出現,則認爲此詞或者短語更具有更好的類別區分能力,適合用來分類
- tf *idf便是該詞語的重要性,是特徵提取的方式
- Tf:term frequency:詞的頻率
- Idf:逆文檔頻率 ,由log(總文檔數量/該詞出現的文檔數量)得出
這樣能夠有效的剔除像‘明天’,‘所以’這樣的詞,因爲他們經常在文檔中出現,讓其不影響結果的判斷
- 調用:from sklearn.feature_extraction.text import TfidfVectorizer
- 代碼實現:
atext = jieba.cut (
"山有木兮未有枝,心悅君兮君不知,有種種吸引力、感召力,神祕感迫使心靈不斷地靠近,隨着迷霧的不斷解開,那層面紗不復存在,變得習以爲常,漸漸地進行疏遠,爲何如此傷心?是自我不夠堅定還是心靈難達境界,讓我獨自傷心,滿心的希望、不捨與留戀,現如今變得冷漠、傷心、無奈" )
btext = jieba.cut ( '在對的時間遇到對的人,是一種緣分' )
ctext = jieba.cut ( "在錯的時間遇到錯的人,是一種殘忍" )
# 轉換爲列表
aa = list ( atext )
bb = list ( btext )
cc = list ( ctext )
t1 = ' '.join ( aa )
t2 = ' '.join ( bb )
t3 = ' '.join ( cc )
tf = TfidfVectorizer()
data = tf.fit_transform ( [t1 , t2 , t3] )
print ( tf.get_feature_names () )
print ( data.toarray () )
- 輸出: