黑马程序员机器学习Day1学习笔记
- 1.數據集的介紹
- 字典特征抽取
- 文本特征提取
- 1.根據詞頻
- 2.根據詞的重要性
- 特征預處理
- 1.歸一化
- 標準化
- 特征降維
- Filter過濾式:低方差過濾法
- PCA降維
機器學習第一天
基礎不牢,地動山搖。直接上手tf,連很多機器學習的基礎包都不會使用。比如sklearn, pandas (使用sklearn 來做特征工程 , pandas 用于數據的清洗和數據的處理)這些數據處理庫,因此回去回爐重造,學習機器學習先。 學習的視頻是黑馬程序員的機器學習視頻。
視頻和資料鏈接 提取碼:1234
本篇文章內容:
開發流程
1)獲取數據
2)數據處理
3)特征工程
4)機器學習算法訓練 - 模型
5)模型評估
6)應用
第一天內容主要講了前3項內容。使用sklearn完成一系列數據處理的工作。
1.數據集的介紹
sklearn 包中包含了很多數據集。比如波士頓的房價信息,鳶尾花數據集等等。小數據集,下載sklearn的時候也順帶下載了,如果是大數據集還需要另外去下載。
1.sklearn.datasets
load* 獲取小規模數據集 已經保存到了本地
fetch_* 獲取大規模數據集 還需要從網上下載這個數據集
數據集是以字典的方式返回的,所以調用數據的時候可以有兩種調用方式。 1)dict["key"] = values
2)dict.key = values
學習任何一個深度學習視頻都知道,有了數據,需要將數據分成訓練集和測試集。 sklearn中使用train_split將數據集分開: sklearn.model_selection.train_split(array, *options)
x:數據集的特征值
y:數據集的標簽值
test_size 測試集的大小,一般為float
random_state 隨機數種子
return 訓練集特征值(x_train),測試紙的特征值(x_test),訓練集的目標值(y_train),測試集的目標值(y_test)
def?datasets_demo():????"""
????sklearn數據集使用
????:return:
????"""
????#?獲取數據集
????iris?=?load_iris()
????print("鳶尾花數據集:\n",?iris)
????print("查看數據集描述:\n",?iris["DESCR"])
????print("查看特征值的名字:\n",?iris.feature_names)
????print("查看特征值:\n",?iris.data,?iris.data.shape)
????#?數據集劃分
????x_train,?x_test,?y_train,?y_test?=?train_test_split(iris.data,?iris.target,?test_size=0.2,?random_state=22)
????print("訓練集的特征值:\n",?x_train,?x_train.shape)
????return?None
輸出結果:iris數據集內容,DESCR描述,feature,data.shape
字典特征抽取
提取特征的步驟:
- 1.實例化sklearn功能函數
- 2.調用fit_transform(數據的根據實例化函數的功能,對數據進行響應的處理。)
- 3.print
???"""
???字典特征抽取
???:return:
???"""
???data?=?[{'city':?'北京','temperature':100},?{'city':?'上海','temperature':60},?{'city':?'深圳','temperature':30}]
???#?1、實例化一個轉換器類
???transfer?=?DictVectorizer(sparse=False)
???#?2、調用fit_transform()
???data_new?=?transfer.fit_transform(data)
???print("data_new:\n",?data_new(),?type(data_new))
???print("特征名字:\n",?transfer.get_feature_names())
???return?None
輸出
data_new:?[[??0.???1.???0.?100.]
?[??1.???0.???0.??60.]
?[??0.???0.???1.??30.]]?<class?'scipy.sparse.csr.csr_matrix'>
特征名字:
?['city=上海',?'city=北京',?'city=深圳',?'temperature']
這種方式的輸出有很多0(即冗余),因此我們通常使用sparse參數,只輸出有數值部分的坐標。
????transfer?=?DictVectorizer(sparse=True)輸出
data_new:???(0,?1)?1.0
??(0,?3)?100.0
??(1,?0)?1.0
??(1,?3)?60.0
??(2,?2)?1.0
??(2,?3)?30.0?<class?'scipy.sparse.csr.csr_matrix'>
特征名字:
?['city=上海',?'city=北京',?'city=深圳',?'temperature']
文本特征提取
1.根據詞頻
英文文本特征提取
使用sklearn.feature_extraction.text的CountVectorizer。 調用方式同上:
def?count_demo():
????"""
????文本特征抽取:CountVecotrizer
????:return:
????"""
????data?=?["life?is?short,i?like?like?python",?"life?is?too?long,i?dislike?python"]
????#?1、實例化一個轉換器類
????transfer?=?CountVectorizer(stop_words=["is",?"too"])
????#?2、調用fit_transform
????data_new?=?transfer.fit_transform(data)
????print("data_new:\n",?data_new.toarray())
????print("特征名字:\n",?transfer.get_feature_names())
????return?None
CountVectorizer(stop_words=["is", "too"])通過stop_words 可以去除統計一些word的詞頻。
輸出
data_new:?[[0?1?2?0?1?1]
?[1?1?0?1?1?0]]
特征名字:
?['dislike',?'life',?'like',?'long',?'python',?'short']
中文本文特征提取
這個是通過空格來區分單詞,對于中文而言,單詞間就沒有空格,因此需要多一步操作。這里調用一個能夠分詞的庫: jieba
import?jiebadef?cut_word(text):
????"""
????進行中文分詞:"我愛北京天安門"?-->?"我?愛?北京?天安門"
????"""
????return?"?".join(list(jieba.cut(text)))
????#join函數,就是將text中文本加入空格。
#中文特征提取代碼
def?count_chinese_demo2():
????"""
????中文文本特征抽取,自動分詞
????:return:
????"""
????#?將中文文本進行分詞
????data?=?["一種還是一種今天很殘酷,明天更殘酷,后天很美好,但絕對大部分是死在明天晚上,所以每個人不要放棄今天。",
????????????"我們看到的從很遠星系來的光是在幾百萬年之前發出的,這樣當我們看到宇宙時,我們是在看它的過去。",
????????????"如果只用一種方式了解某樣事物,你就不會真正了解它。了解事物真正含義的秘密取決于如何將其與我們所了解的事物相聯系。"]
????data_new?=?[]
????for?sent?in?data:
????????data_new.append(cut_word(sent))
????#?print(data_new)
????#?1、實例化一個轉換器類
????transfer?=?CountVectorizer(stop_words=["一種",?"所以"])
????#?2、調用fit_transform
????data_final?=?transfer.fit_transform(data_new)
????print("data_new:\n",?data_final.toarray())
????print("特征名字:\n",?transfer.get_feature_names())
????return?None
2.根據詞的重要性
如何判斷一篇文章在說什么? 沒錯,就是關鍵詞! 在谷歌之前的搜索,都是通過一篇文章中,詞的出現頻率來對結果進行搜索排序。谷歌搜索的創新就是在于將引用最多的文章放到最前面。所以并不是說一個單詞出現的頻率越高這個單詞就越重要。應該是這篇文章有,而其他文章沒有的單詞,這個才更有辨識度。
在sklearn庫中,TfidfVectorzer負責這個功能(這個函數比前面根據詞頻的函數用的更多)
def?tfidf_demo():????"""
????用TF-IDF的方法進行文本特征抽取
????:return:
????"""
????#?將中文文本進行分詞
????data?=?["一種還是一種今天很殘酷,明天更殘酷,后天很美好,但絕對大部分是死在明天晚上,所以每個人不要放棄今天。",
????????????"我們看到的從很遠星系來的光是在幾百萬年之前發出的,這樣當我們看到宇宙時,我們是在看它的過去。",
????????????"如果只用一種方式了解某樣事物,你就不會真正了解它。了解事物真正含義的秘密取決于如何將其與我們所了解的事物相聯系。"]
????data_new?=?[]
????for?sent?in?data:
????????data_new.append(cut_word(sent))
????#?print(data_new)
????#?1、實例化一個轉換器類
????transfer?=?TfidfVectorizer(stop_words=["一種",?"所以"])
????#?2、調用fit_transform
????data_final?=?transfer.fit_transform(data_new)
????print("data_new:\n",?data_final.toarray())
????print("特征名字:\n",?transfer.get_feature_names())
????return?None
特征預處理
1.歸一化
為了有一個量綱,不要讓一些數值小的參數被數值大的參數所掩蓋,所以我們使用歸一化處理,讓大家在同一起跑線。 計算公式: mx,mi是你指定區間的數值大小。
讀入數據使用Pandas的read_csv()函數。 歸一化的函數
def?minmax_demo():????"""
????歸一化
????:return:
????"""
????#?1、獲取數據
????data?=?pd.read_csv("dating.txt")
????data?=?data.iloc[:,?:3]?#只取數據的前三列數據
????print("data:\n",?data)
????#?2、實例化一個轉換器類
????transfer?=?MinMaxScaler(feature_range=[2,?3])
????#?3、調用fit_transform
????data_new?=?transfer.fit_transform(data)
????print("data_new:\n",?data_new)
????return?None
標準化
歸一化的缺點:如果有幾個數值異常,那么就會影響整個歸一化矩陣。所以引入了標準化
- 定義:原始數據轉換成為均值為0,標準差為1的范圍內
- 對于歸一化來說:如果出現異常點,影響了最大值和最小值,那么結果顯然會發生改變
- 對于標準化來說:如果出現異常點,由于具有一定數據量,少量的異常點對于平均值的影響并不大,從而方差改變較小。
調用sklearn中的StandardScaler()函數
def?stand_demo():????"""
????標準化
????:return:
????"""
????#?1、獲取數據
????data?=?pd.read_csv("dating.txt")
????data?=?data.iloc[:,?:3]
????print("data:\n",?data)
????#?2、實例化一個轉換器類
????transfer?=?StandardScaler()
????#?3、調用fit_transform
????data_new?=?transfer.fit_transform(data)
????print("data_new:\n",?data_new)
????return?None
特征降維
降維:顧明思議,就是降低數據的維度(減少不重要的信息,加快處理的速度)
Filter過濾式:低方差過濾法
如果兩個數據的方差很大,則這個數據有意義。
特征方差小:某個特征大多樣本相近,那么這些數據就是冗余
特征=方差大:那么這些特征都有意義,需要保留。
最后如何去表達兩遍參數之間的相關程度呢? 這里我們使用相關系數來表示兩個變量的相關程度,公式如下 比如我們的x,y如下圖所示
計算結果
相關系數為+0.9942>0,因此x,y是呈現正相關。
- r>0 兩變量正相關,r<0兩變量負相關
- |r|=1 兩變量完全相關,r=0無相關
- |r|<0.4 低度相關,0.4<|r|<0.7顯著性相關, |r|>0.7 高度線性相關。
計算相關性使用到了scipy庫。 numpy,scipy的關系圖:
來自Python numpy,scipy,pandas這些庫的區別是什么?
庫的調用方法同上: 1)先實例化一個轉換器類 2)調用fit_transform
from?sklearn.feature_selectioarn.decomposition?import?PCAfrom?scipy.stats?import?pearsonr
def?variance_demo():
????"""
????過濾低方差特征
????:return:
????"""
????#?1、獲取數據
????data?=?pd.read_csv("factor_returns.csv")
????data?=?data.iloc[:,?1:-2]
????print("data:\n",?data)
????#?2、實例化一個轉換器類
????transfer?=?VarianceThreshold(threshold=10)?#去除低方差數據
????#?3、調用fit_transform
????data_new?=?transfer.fit_transform(data)
????print("data_new:\n",?data_new,?data_new.shape)
????#?計算某兩個變量之間的相關系數
????r1?=?pearsonr(data["pe_ratio"],?data["pb_ratio"])
????print("相關系數:\n",?r1)
????r2?=?pearsonr(data['revenue'],?data['total_expense'])
????print("revenue與total_expense之間的相關性:\n",?r2)
????plt.figure(figsize=[20,?8],?dpi=100)??#?figsize?設定fig的長寬高
????plt.scatter(data['revenue'],?data['total_expense'])
????plt.show()
????return?None
PCA降維
降維中,PCA降維用的比較多,我覺得比較好的PCA講解視頻:中字 主成分分析法(PCA)| 分步步驟解析 看完你就懂了! PCA的原理比較復雜,這個視頻我覺得講的很通俗和清楚。如果只是想學一下如何調用就無需關系。看代碼就行。 PCA降維代碼
from?sklearn.decomposition?import?PCAdef?pca_demo():
????"""
????PCA降維
????:return:
????"""
????data?=?[[2,8,4,5],?[6,3,0,8],?[5,4,9,1]]
????#?1、實例化一個轉換器類
????#n_components=小數,?表示保留百分之多少的信息
????#整數;減少到多少特征
????transfer?=?PCA(n_components=0.95)
????#?2、調用fit_transform
????data_new?=?transfer.fit_transform(data)
????print("data_new:\n",?data_new)
????return?None
n_components=小數, 表示保留百分之多少的信息;若為整數;減少到多少特征
完,以上為Day1的內容。
總結
以上是生活随笔為你收集整理的黑马程序员机器学习Day1学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 排版人员 快速排版_选择排版前应了解的事
- 下一篇: [html] 实现一个页面锁屏的功能