




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)第8章 機(jī)器學(xué)習(xí)方法概述與數(shù)據(jù)加載《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》8.1機(jī)器學(xué)習(xí)概述機(jī)器學(xué)習(xí)(Machine
Learning,ML)是從已有的觀察數(shù)據(jù)中學(xué)習(xí)規(guī)律,從而獲得知識、建立數(shù)學(xué)模型,并利用模型對新的觀察數(shù)據(jù)做出預(yù)測或解釋。機(jī)器學(xué)習(xí)的關(guān)鍵是從已有的觀察數(shù)據(jù)中學(xué)習(xí)模型、并不斷調(diào)整參數(shù),使模型擬合已有的觀察數(shù)據(jù),從而建立合適的數(shù)學(xué)模型。這一學(xué)習(xí)過程與人腦的學(xué)習(xí)過程比較類似。在生產(chǎn)、生活中,進(jìn)一步將這些知識應(yīng)用于商品個性化推薦、社交網(wǎng)絡(luò)中的好友推薦、人臉識別、氣象預(yù)測、房價預(yù)測等。機(jī)器學(xué)習(xí)是計算機(jī)與統(tǒng)計學(xué)科的交叉研究領(lǐng)域,是目前實現(xiàn)人工智能和數(shù)據(jù)科學(xué)應(yīng)用的主要方式之一。從輸入的數(shù)據(jù)特性來分,機(jī)器學(xué)習(xí)算法大體上分為有監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí)。有監(jiān)督學(xué)習(xí)主要用于分類和回歸。無監(jiān)督學(xué)習(xí)主要用于聚類、特征提取和降維。在機(jī)器學(xué)習(xí)領(lǐng)域還有其他一些分類方法,本書不展開討論?!禤ython數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》8.1.1用有監(jiān)督學(xué)習(xí)來做預(yù)測■有監(jiān)督學(xué)習(xí)是指利用機(jī)器學(xué)習(xí)算法,從帶標(biāo)簽的輸入數(shù)據(jù)(通常稱為訓(xùn)練數(shù)據(jù))中學(xué)習(xí)模型,并使用該模型對新的輸入數(shù)據(jù)計算新的輸出來作
為與新數(shù)據(jù)關(guān)聯(lián)的預(yù)測值。這里帶標(biāo)簽的數(shù)據(jù)是指每一條輸入記錄有對
應(yīng)的已知輸出,這個輸出稱為標(biāo)簽。每一條數(shù)據(jù)記錄是一個數(shù)據(jù)樣本。
從已知數(shù)據(jù)中學(xué)習(xí)得到的模型描述了輸入與標(biāo)簽(輸出)之間的關(guān)系。
當(dāng)新的輸入到來時,就可以用這個模型來計算相應(yīng)的輸出作為預(yù)測標(biāo)簽。《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》假設(shè)有一批如表8.1所示的記錄學(xué)生每學(xué)期學(xué)習(xí)狀態(tài)的數(shù)據(jù)。該表同時記錄了學(xué)生期末考試等第。每天平均學(xué)習(xí)時長每天平均運動時長每天平均游戲時長考試等第1010優(yōu)秀8050.5良好91.50.5優(yōu)秀8.510優(yōu)秀8.50.51良好522中等503及格表2
8.1是一個訓(xùn)練數(shù)據(jù)2,每一行表示每位學(xué)5生在某個學(xué)期的學(xué)習(xí)不情及況格。最后一列是標(biāo)簽,表示該學(xué)生該學(xué)期期末考試結(jié)果等第情況。表8.1中每一行是一個輸入數(shù)據(jù),前
3列表示一個學(xué)生在校學(xué)習(xí)的特征,最后一列是相對應(yīng)的標(biāo)簽(考試等地)。根據(jù)這些數(shù)據(jù),機(jī)器學(xué)習(xí)算法能夠?qū)W習(xí)到輸入特征與標(biāo)簽之間的關(guān)系(模型)。在學(xué)習(xí)得到的模型中輸入新的數(shù)據(jù)(包含三個特征的值),計算考試等地結(jié)果作為預(yù)測值。《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》■有監(jiān)督學(xué)習(xí)的這一過程可以用圖
8.1來表示?!鰣D8.1給出了有監(jiān)督學(xué)習(xí)的粗略步驟。在使用算法根據(jù)數(shù)據(jù)進(jìn)行學(xué)
習(xí)之前,需要將原始數(shù)據(jù)中考試
等地這一項轉(zhuǎn)換為數(shù)值表示。在
學(xué)習(xí)過程中,需要對學(xué)習(xí)效果進(jìn)
行評價,根據(jù)評價來不斷調(diào)整學(xué)
習(xí)參數(shù),以獲得較好的模型。這
些過程將在后面章節(jié)中逐步展開。《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》■有監(jiān)督學(xué)習(xí)又分為分類和回歸。如果數(shù)據(jù)中的標(biāo)簽是離散型的,如圖
8.1中的考試等第,這類有監(jiān)督學(xué)習(xí)的過程稱為分類。如果數(shù)據(jù)中的標(biāo)簽是連續(xù)型的,這類有監(jiān)督學(xué)習(xí)的過程稱為回歸分析。如果將圖8.1中數(shù)據(jù)的考試等第改成浮點數(shù)表示的具體分值,則這類有監(jiān)督學(xué)習(xí)就是回歸分析,預(yù)測的結(jié)果也是浮點數(shù)的分值?!鲇斜O(jiān)督學(xué)習(xí)是利用機(jī)器學(xué)習(xí)算法,從已知結(jié)果(標(biāo)簽)的歷史數(shù)據(jù)中發(fā)現(xiàn)規(guī)律,并根據(jù)規(guī)律建立模型,然后利用模型對新的數(shù)據(jù)計算(預(yù)測)未知的結(jié)果?!禤ython數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》8.1.2用無監(jiān)督學(xué)習(xí)發(fā)現(xiàn)數(shù)據(jù)之間的關(guān)系有監(jiān)督學(xué)習(xí)中用于學(xué)習(xí)的訓(xùn)練數(shù)據(jù)必須有已知的結(jié)果(標(biāo)簽)。如果學(xué)習(xí)算法只需要輸入數(shù)據(jù),沒有(或不需要)與之對應(yīng)的標(biāo)簽數(shù)據(jù),這類機(jī)器學(xué)習(xí)稱為無監(jiān)督學(xué)習(xí)。無監(jiān)督學(xué)習(xí)主要用于聚類和降維,通常用于探索性分析,探索并發(fā)現(xiàn)數(shù)據(jù)之間隱藏的關(guān)系。聚類是根據(jù)輸入數(shù)據(jù)的特征,將數(shù)據(jù)劃分為不同的組,同一組內(nèi)的數(shù)據(jù)盡可能相似,不同組之間的數(shù)據(jù)差別盡可能大。通過聚類,發(fā)現(xiàn)數(shù)據(jù)樣本之間的關(guān)系。降維是指接受包含較多特征的高維數(shù)據(jù),找出特征之間的關(guān)系,用較少的特征來描述數(shù)據(jù),并盡可能保留原有數(shù)據(jù)的描述能力。在降維處理中,發(fā)現(xiàn)特征之間的關(guān)系,去掉冗余的特征,用盡可能少的特征來描述數(shù)據(jù),降低數(shù)據(jù)的復(fù)雜程度。無監(jiān)督學(xué)習(xí)的降維可用于數(shù)據(jù)預(yù)處理中的特征降噪,去除噪聲特征,有利于提高數(shù)據(jù)處理速度。通過降維,也可以將高維數(shù)據(jù)投影到二維或三維空間,實現(xiàn)數(shù)據(jù)在二維或三維空間中的可視化?!禤ython數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》8.2
scikit-learn簡介與安裝■目前有不少實現(xiàn)機(jī)器學(xué)習(xí)算法的Python程序庫。Scikit-learn是目前機(jī)器學(xué)習(xí)領(lǐng)域最常用的程序庫之一,為大部分機(jī)器學(xué)習(xí)算法提供了高效的實
現(xiàn)機(jī)制。它由一個開源社區(qū)維護(hù),可以免費下載、使用和分發(fā)。Scikit-learn是構(gòu)建于numpy、scipy和matplotlib之上的機(jī)器學(xué)習(xí)Python代碼庫,提供了統(tǒng)一的、管道式的API接口,所有算法的處理流程都有相同的調(diào)用方式。掌握一種算法的處理流程后,就可以快速掌握其他算法的處理流程?!霰緯写蟛糠謾C(jī)器學(xué)習(xí)案例調(diào)用scikit-learn庫中的模塊來實現(xiàn)。《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》8.2.1
scikit-learn的安裝■安裝完P(guān)ython官方發(fā)行版本后,Python的標(biāo)準(zhǔn)庫中沒有scikit-learn庫,需要另外安裝。打開windows命令行窗口,輸入pip
install
sklearn,等待安裝完成。此時,系統(tǒng)從Pypi庫下載并安裝,下載速度可能較慢,會導(dǎo)致安裝失敗。此時可以通過-i參數(shù)指定從國內(nèi)Pypi鏡像地址下載。如果采用清華大學(xué)的Pypi站點鏡像,使用命令pip
install
sklearn-i/simple
some-package。也可以通過百索Pypi的國內(nèi)其他鏡像站點。也可以先下載whl文件,然后在本地執(zhí)行安裝。安裝完成后可以使用import
sklearn導(dǎo)入?!鲇行﹑ython第三方發(fā)行版本(如Anaconda)已經(jīng)內(nèi)置了sklearn。安裝完這些發(fā)行版本后,不需要再單獨安裝sklearn。《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》8.2.2
scikit-learn中的數(shù)據(jù)表示機(jī)器學(xué)習(xí)是從數(shù)據(jù)中學(xué)得模型,數(shù)據(jù)在學(xué)習(xí)過程中具有重要的作用。因此,有必要先了解一下scikit-learn中的數(shù)據(jù)表示。Scikit-learn認(rèn)為最好使用二維表來表示數(shù)據(jù)??梢杂枚S數(shù)組或矩陣表示二維表。每一行稱為一個樣本,每一列表示一個特征。每個樣本(每行)表示一個對象某一時刻的特征。每個特征(每列)表示樣本某個特征的觀測值,可以是離散的值,也可以是連續(xù)的值。如果行數(shù)用n_samples來表示,列數(shù)用n_features來表示,則特征數(shù)據(jù)是一個維度為(n_samples,n_features)的二維數(shù)據(jù),通常稱為特征矩陣,可記作大寫的
X。特征矩陣可以用numpy的數(shù)組或pandas的DataFrame來表示。在有監(jiān)督學(xué)習(xí)中,除了特征矩陣,還需要與特征矩陣中每一行對應(yīng)的標(biāo)簽(或稱為
目標(biāo)數(shù)組),表示每個樣本的目標(biāo)值,通常記作小寫的y。對于單目標(biāo)問題,目標(biāo)數(shù)
組是一維的,可以用numpy的數(shù)組或pandas的Series表示,它的形狀可以表示為
(n_sample,)。對于具有n_targets目標(biāo)的多目標(biāo)問題,可以用numpy的二維數(shù)組或
pandas的DataFrame表示,其形狀可以表示為(n_samples,n_targets)。本書主要關(guān)注單目標(biāo)問題?!禤ython數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》■可以從UCI機(jī)器學(xué)習(xí)數(shù)據(jù)庫中下載紅色葡萄酒理化特征測量數(shù)據(jù)及其對應(yīng)的質(zhì)量數(shù)據(jù)文件winequality-red.csv。數(shù)據(jù)一共有12列,其中第1列fixed
acidity表示測量的固定酸度;第2列volatile
acidity表示揮發(fā)性酸度第3列citric
acid表示檸檬酸含量;第4列residual
sugar表示甜度;第5列chlorides表示氯化物含量;第6列free
sulfur
dioxide表示游離二氧化硫含量;第7列total
sulfur
dioxide表示總二氧化硫含量;第8列density表示密度;第9列pH表示Ph值;第10列sulphates表示硫酸酯含量;第11列alcohol表示酒精含量;第12列quality為基于感官數(shù)據(jù)給出的輸出變量,位于0和10之間,表示葡萄酒的質(zhì)量。《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》【例8-1】讀取文件data目錄下的winequality-red.csv,分離出特征矩陣和標(biāo)簽數(shù)據(jù)。#
example8_1.py#
coding=utf-8import
pandas
as
pd#設(shè)置DataFrame以右對齊方式打印輸出
pd.set_option("display.unicode.east_asian_width",True)df=pd.read_csv("./data/winequality-red.csv",sep=";")print("原始數(shù)據(jù)前3行、后5列:\n",df.iloc[:3,-5:],sep="")print("原始數(shù)據(jù)形狀:",df.shape)X=df.drop("quality",axis=1)print("特征部分前3行、后5列:\n",X.iloc[:3,-5:],sep="")print("特征數(shù)據(jù)形狀:",X.shape)y=df["quality"]
#分離出標(biāo)簽(目標(biāo)、輸出)數(shù)據(jù)
print("目標(biāo)數(shù)據(jù)前3行:\n",y[:3],sep="")print("目標(biāo)數(shù)據(jù)形狀:",y.shape)《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》■在Scikit-learn中,數(shù)據(jù)采用numpy中的數(shù)組、Pandas中的Series或DataFrame、SciPy中的稀疏矩陣來表示。有了適當(dāng)?shù)臄?shù)據(jù)形式之后,就可以使用Scikit-learn的API來進(jìn)行學(xué)習(xí)、評估和預(yù)測?!禤ython數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》8.2.3
scikit-learn中的機(jī)器學(xué)習(xí)基本步驟■Scikit
learn為各種機(jī)器學(xué)習(xí)提供了統(tǒng)一的接口,學(xué)習(xí)算法被封裝為類。機(jī)器學(xué)習(xí)的任務(wù)用一串基本算法實現(xiàn)。利用scikit
learn實現(xiàn)機(jī)器學(xué)習(xí)的基本步驟可以用圖8.2表示?!禤ython數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》■獲取數(shù)據(jù)后,首先要進(jìn)行數(shù)據(jù)預(yù)處理(常用方法見第7章Pandas數(shù)據(jù)處理和第9章數(shù)據(jù)預(yù)處理部分)。接著將數(shù)據(jù)分為特征矩陣和目標(biāo)數(shù)據(jù)。然后將樣本分為訓(xùn)練集和測試集?!鋈绻硞€特征的方差遠(yuǎn)大于其他特征值的方差,那么它在算法學(xué)習(xí)中將占據(jù)主導(dǎo)位置,會導(dǎo)致算法不能學(xué)習(xí)其他特征或者降低了其他特征在模型中的作用,從而導(dǎo)致模型收斂速度慢甚至不收斂,因此需要先對特征數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化或歸一化的縮放處理。樹、森林等部分算法不需要特征的縮放預(yù)處理?!鋈绻麛?shù)據(jù)的特征較多,為了提高計算速度,可能需要特征選擇和特征提取。經(jīng)過這些預(yù)處理步驟后,數(shù)據(jù)將提供給模型對象進(jìn)行學(xué)習(xí)(提供給
fit方法)。圖8.2中對數(shù)據(jù)預(yù)處理部分進(jìn)行了簡化?!禤ython數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》8.3加載數(shù)據(jù)■數(shù)據(jù)是機(jī)器學(xué)習(xí)建立模型的基礎(chǔ),也是預(yù)測的根據(jù)。原始數(shù)據(jù)通常以各種形式存在。為方便學(xué)習(xí),也會用到scikit-learn中的內(nèi)置數(shù)據(jù)集和仿真數(shù)據(jù)集。■前面章節(jié)已經(jīng)介紹了numpy和pandas讀取csv和excel文件的方法、pandas讀取數(shù)據(jù)庫中數(shù)據(jù)的方法,這里不再贅述。本節(jié)介紹scikit-learn數(shù)據(jù)集加載方法、通過pandas-datareader模塊加載金融數(shù)據(jù)的方法、通過第三方平臺API加載數(shù)據(jù)集的方法?!禤ython數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》8.3.1加載scikit-learn中的小數(shù)據(jù)集■scikit-learn提供了一些隨模塊一起安裝、不需要從外部網(wǎng)站下載任何文件的小型標(biāo)準(zhǔn)數(shù)據(jù)集,這類數(shù)據(jù)集稱為Toy
datasets,通過datasets模塊中的load_<dataset_name>()格式的函數(shù)來加載。■數(shù)據(jù)集文件位于sklearn安裝目錄下的datasets\data子目錄下。例如,在
Python安裝目錄下的Lib\site-packages\sklearn\datasets\data子目錄中。載Toy數(shù)據(jù)集的部分函數(shù)如表8.2所示,其內(nèi)容選自scikit-learn的API文檔?!禤ython數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》函數(shù)說明load_boston(*[,
return_X_y])波士頓房價數(shù)據(jù)集(用于回歸分析),從scikit-learn
1.0開始棄用,1.2開load_iris(*[,
return_X_y,
as_frame])load_diabetes(*[,
return_X_y,
as_frame])移除iris(鳶尾花)數(shù)據(jù)集(用于分類分糖尿病數(shù)據(jù)集(用于回歸分析)load_digits(*[,n_class,return_X_y,as_frame])數(shù)字?jǐn)?shù)據(jù)集(用于分類分析)linnerud物理鍛煉數(shù)據(jù)集(多輸出回load_linnerud(*[,
return_X_y,
as_frame])load_wine(*[,
return_X_y,
as_frame])load_breast_cancer(*[,
return_X_y,
as_frame])load_sample_images()wine數(shù)據(jù)集(用于分類分析)威斯康星乳腺癌數(shù)據(jù)集(用于分類分加載圖像數(shù)據(jù)集,用于圖像處理《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》對各函數(shù)中的參數(shù),這里不展開闡述,讀者可以參考幫助文檔或官方在線文檔。下面演示加載著名的鳶尾花(iris)數(shù)據(jù)集、并了解返回數(shù)據(jù)的相關(guān)信息。>>>
from
sklearn
import
datasets>>>
iris
=
datasets.load_iris()返回一個類似于字典的sklearn.utils.Bunch對象>>>
type(iris)<class
"sklearn.utils.Bunch">>>>
iris.keys()dict_keys(["data",
"target",
"frame",
"target_names",
"DESCR",
"feature_names",
"filename",
"data_>>>#獲取Bunch對象中屬性數(shù)據(jù)的方式1#獲取特征矩陣>>>
X=iris.data>>>
X[:3]array([[5.1,
3.5,
1.4,
0.2],[4.9,
3.
,
1.4,
0.2],[4.7,
3.2,
1.3,
0.2]])>>>
X.shape(150,
4)>>>#獲取Bunch對象中屬性數(shù)據(jù)的方式2>>>X=iris["data"]
#獲取特征矩陣>>>
X[:3]array([[5.1,
3.5,
1.4,
0.2],[4.9,
3.
,
1.4,
0.2],[4.7,
3.2,
1.3,
0.2]])>>>
X.shape(150,
4)>>>y=iris.target#獲取目標(biāo)數(shù)據(jù)>>>
y[:3]array([0,
0,
0])>>>
y.shape(150,)《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》>>>iris.feature_names
#特征名稱["sepal
length
(cm)",
"sepal
width
(cm)",
"petal
length
(cm)"width
(cm)"]>>>iris.target_names
#目標(biāo)名稱array(["setosa",
"versicolor",
"virginica"],
dtype="<U10")>>>iris.target[[0,2]]
#第0和2行對應(yīng)的target值array([0,0])>>>#第0和2行目標(biāo)值對應(yīng)的目標(biāo)名稱>>>
iris.target_names[iris.target[[0,
2]]]array(["setosa",
"setosa"],
dtype="<U10")>>>《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》■Toy
Datasets對于快速演示scikit-learn中實現(xiàn)的各種算法行為非常有用。然而,這些數(shù)據(jù)集往往太小,不能代表現(xiàn)實世界的機(jī)器學(xué)習(xí)任務(wù)。■另外,sklearn.datasets.load_files(container_path,*[,…])函數(shù)加載用定的文本文件,加載時以子文件夾名稱作為類別;
sklearn.datasets.load_sample_image(image_name)加載用戶指定路徑和名稱的單個圖像,返回numpy數(shù)組?!禤ython數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》8.3.2下載并加載scikit-learn中的大數(shù)據(jù)集scikit-learn中,通過datasets模塊的fetch_<dataset_name>()函數(shù)下載并加載更大的數(shù)據(jù)集,用于測試、解決實際問題。默認(rèn)情況下,下載的文件保存在用戶主文件夾中的一個名為“scikit_learn_data”的文件夾下??梢酝ㄟ^函數(shù)查詢下載后文件的保存位置。>>>
from
sklearn
import
datasets>>>datasets.get_data_home()"C:\\Users\\用戶名\\scikit_learn_data">>>也可以通過SCIKIT_LEARN_DATA環(huán)境變量來設(shè)置存儲路徑。在系統(tǒng)的環(huán)境變量中增加名為SCIKIT_LEARN_DATA的環(huán)境變量,指向自定義的目錄,如“G:\scikit_learn_data”。再次啟動Python,查詢scikit-learn大數(shù)據(jù)集文件的保存路徑>>>
from
sklearn
import
datasets>>>
datasets.get_data_home()"G:\\scikit_learn_data">>>《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》■Scikit-learn的datasets模塊中下載并加載相關(guān)大數(shù)據(jù)集的部分函數(shù)如表8.所示,其內(nèi)容選自scikit-learn的API文檔。針對各數(shù)據(jù)集的詳細(xì)信息,這里不展開闡述。函數(shù)
fetch_olivetti_faces(*[,data_home,…])
fetch_20newsgroups(*[,data_home,subset,…])
fetch_20newsgroups_vectorized(*[,subset,…])fetch_california_housing(*[,
...])fetch_lfw_people(*[,
data_home,
funneled,
…])fetch_lfw_pairs(*[,
subset,
data_home,
…])fetch_covtype(*[,
data_home,
…])fetch_rcv1(*[,
data_home,
subset,
…])fetch_kddcup99(*[,
subset,
data_home,
…])datasets.fetch_openml([name,
version,
…])說明加載AT&T的Olivetti臉部數(shù)據(jù)集(用于分類)加載20個新聞組數(shù)據(jù)集的文件名和數(shù)據(jù)(用于分類)加載20個新聞組數(shù)據(jù)集并將其向量化為令牌計數(shù)(用于分類)加載加利福尼亞住房數(shù)據(jù)集(用于回歸),目標(biāo)值是以10萬為單位的房價中位數(shù)加載帶標(biāo)記的野外人員面部數(shù)據(jù)集(用于分類)加載帶標(biāo)記的野外人員成對的面部數(shù)據(jù)集,用來判斷成對的兩張面部圖片是否為同一人(用于分類)加載covertype數(shù)據(jù)集(用于分類)加載RCV1多標(biāo)簽數(shù)據(jù)集(用于分類)加載kddcup99數(shù)據(jù)集(用于分類)從openml中通過名稱或數(shù)據(jù)集ID獲取數(shù)據(jù)集《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》■表8.3中的每個函數(shù)都有data_home參數(shù),用來設(shè)置下載的數(shù)據(jù)集存放路徑。如果沒有提供data_home參數(shù),下載的數(shù)據(jù)將保存在默認(rèn)存儲路徑下。下面演示加利福尼亞住房數(shù)據(jù)集的加載方法。>>>
from
sklearn.datasets
import
fetch_california_housing>>>
housing
=
fetch_california_housing()第一次執(zhí)行housing=fetch_california_housing()時速度有點慢,因為要等待將數(shù)據(jù)下載到本地。下載完成后,在設(shè)置的文件路徑下出現(xiàn)文件
cal_housing_py3.pkz。加載完成后,數(shù)據(jù)集內(nèi)容保存在變量中。>>>
type(housing)<class
"sklearn.utils.Bunch">《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》>>>
housing.keys()dict_keys(["data",
"target",
"frame",
"target_names",
"feature_names",
"DESCR"])>>>
housing.feature_names["MedInc",
"HouseAge",
"AveRooms",
"AveBedrms",
"Population",
"AveOccup",
"Latitude",
"Longitu>>>
housing.target_names["MedHouseVal"]>>>#特征矩陣前2行>>>
print(housing["data"][:2])[[
8.32520000e+00
4.10000000e+01
6.98412698e+00
1.02380952e+003.22000000e+02
2.55555556e+00
3.78800000e+01
-1.22230000e+02][
8.30140000e+00
2.10000000e+01
6.23813708e+00
9.71880492e-012.40100000e+03
2.10984183e+00
3.78600000e+01
-1.22220000e+02]]《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》>>>#可以用DataFrame表示特征矩陣>>>
import
pandas
as
pd>>>
X
=
pd.DataFrame(housing.data,
columns=housing.feature_names)>>>
X[:3]MedInc
HouseAge
AveRooms
...
AveOccup
Latitude
Longitude0
8.325241.06.984127
...
2.55555637.88-122.231
8.301421.06.238137
...
2.10984237.86-122.222
7.257452.08.288136
...
2.80226037.85-122.24[3
rows
x
8
columns]>>>
X.shape(20640,
8)>>>
y
=
housing.target>>>
yarray([4.526,
3.585,
3.521,
...,
0.923,
0.847,
0.894])《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》8.3.3用scikit-learn構(gòu)造仿真數(shù)據(jù)集Scikit-learn中,可以通過datasets模塊的make_<dataset_name>()函數(shù)構(gòu)造具有定特性的仿真數(shù)據(jù)集??梢陨删垲悢?shù)據(jù)集、單標(biāo)簽的分類數(shù)據(jù)集、多標(biāo)簽分類數(shù)據(jù)集、回歸數(shù)據(jù)集、流形學(xué)習(xí)數(shù)據(jù)集等。表8.4列出了scikit-learn中生成仿真數(shù)據(jù)集的部分函數(shù),其內(nèi)容選自scikit-learn的API文檔。函數(shù)
datasets.make_biclusters(shape,n_clusters,*)datasets.make_blobs([n_samples,n_features,…])
datasets.make_circles([n_samples,shuffle,…])
datasets.make_classification([n_samples,…])
datasets.make_moons([n_samples,shuffle,…])
datasets.make_multilabel_classification([…])datasets.make_regression([n_samples,…])
datasets.make_s_curve([n_samples,noise,…])
datasets.make_spd_matrix(n_dim,*[,…])
datasets.make_swiss_roll([n_samples,noise,…])說明生成一個具有恒等對角線結(jié)構(gòu)的數(shù)組用于雙聚類生成各向同性服從高斯分布的點用于聚類在平面上生成大圓形狀里面嵌套小圓的數(shù)據(jù)集生成一個隨機(jī)的n-分類問題數(shù)據(jù)集生成兩個交叉半圓形狀的數(shù)據(jù)集生成隨機(jī)多標(biāo)簽分類數(shù)據(jù)集生成一個隨機(jī)回歸數(shù)據(jù)集生成S-形曲線數(shù)據(jù)集生成一個隨機(jī)對稱的正定矩陣生成一個瑞士卷數(shù)據(jù)集《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》這里簡要介紹生成聚類數(shù)據(jù)集的make_blobs()函數(shù)、生成分類數(shù)據(jù)集的
make_classification()函數(shù)、生成回歸數(shù)據(jù)集的make_regression()函數(shù)。1、利用make_blobs()函數(shù)生成聚類數(shù)據(jù)集sklearn.datasets模塊下的make_blobs(n_samples=100,n_features=2,*,centers=None,cluster_std=1.0,center_box=(-10.0,10.0),shuffle=True,random_state=None,return_centers=False)函數(shù)用來生成服從高斯分布的聚類數(shù)據(jù)集。在前面章節(jié)中,我們已經(jīng)提到,函數(shù)形式參數(shù)中單獨的一個星號(*)是位置標(biāo)志位,表示該位置之后的參數(shù)在函數(shù)調(diào)用時只能以關(guān)鍵參數(shù)的形式賦值,該星號本身不是參數(shù)。其它參數(shù)含義如下:
n_samples如果是整數(shù)int類型,則表示在集群中平均分配的總數(shù)據(jù)點數(shù)量;如果是類似于數(shù)組的值,每個元素分別表示各個集群的樣本數(shù)量。n_features表示每個樣本的特征數(shù)量,也就是自變量個數(shù)。
centers表示生成的聚類中心數(shù)或固定的聚類中心位置;如果n_samples是整數(shù)且centers為None,則生成3個聚類中心;如果n_samples是類似于數(shù)組的值,那么中心centers必須是
None或者是長度等于n_samples長度的數(shù)組。《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》下面給出使用make_blobs()函數(shù)生成數(shù)據(jù)集的簡單案例。>>>
from
sklearn.datasets
import
make_blobs>>>
blobs
=
make_blobs(centers=3,shuffle=True,random_state=50)>>>
type(blobs)<class
"tuple">>>>
len(blobs)2>>>
X_features
=
blobs[0]>>>
type(X_features)<class
"numpy.ndarray">>>>
X_features.shape(100,
2)>>>
X_features[:3]array([[-3.65963603,
-4.44685518],[-3.72765875,
0.39097046],[-0.52020154,
-5.59905297]])>>>
y_target
=
blobs[1]>>>
type(y_target)<class
"numpy.ndarray">>>>
y_target.shape(100,)>>>
y_target[:3]array([1,
1,
0])《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》>>>
another_blobs
=
make_blobs(centers=3,shuffle=True,random_state=50,return_centers=True)>>>
len(another_blobs)3>>>
X_features
=
another_blobs[0]>>>
X_features.shape(100,
2)>>>
y_target
=
another_blobs[1]>>>
y_target.shape(100,)>>>
centers
=
another_blobs[2]>>>
centersarray([[-0.10796709,
-5.43833791],[-4.89052152,
-2.07340181],[-2.45369805,
9.9314846
]])《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》■2、利用make_classification()函數(shù)生成分類數(shù)據(jù)集sklearn.datasets模塊中的函數(shù)make_classification(n_samples=100,n_features=n_informative=2,n_redundant=2,n_repeated=0,n_classes=2,n_clusters_per_clweights=None,flip_y=0.01,class_sep=1.0,hypercube=True,shift=0.0,scale=1shuffle=True,random_state=None)可以生成一個隨機(jī)的n類分類問題的模擬數(shù)據(jù)集。主要參數(shù)含義如下:n_samples表示要創(chuàng)建的樣本數(shù)量,默認(rèn)為100。
n_features表示總特征個數(shù),默認(rèn)為20;包括n_informative所表示的有用信息特征個數(shù)、n_redundant所表示的冗余特征個數(shù)、n_repeated所表示的重復(fù)特征個數(shù)、以及隨機(jī)生成的無用特征個數(shù)。n_classes表示類別個數(shù)。shuffle表示是否打亂樣本和特征,默認(rèn)為True。《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》下面給出使用make_classification()函數(shù)生成分類數(shù)據(jù)集的簡單案例。>>>
from
sklearn.datasets
import
make_classification>>>
X,
y
=
make_classification(n_features=5,
n_informative=3,n_redundant=0,
n_classes=3,random_state=50)>>>
type(X)<class
"numpy.ndarray">>>>
X.shape(100,
5)>>>
X[:3]array([[
0.45858759,
-0.60463243,
1.63557165,
0.291211
,
-1.17989844],[-1.36058162,
-0.54515083,
-2.24212805,
-0.48747102,
-0.11724818],[-1.17307421,
1.20650169,
-1.02466205,
2.87220976,
-0.01180832]])>>>
type(y)<class
"numpy.ndarray">>>>
y.shape(100,)>>>
y[:3]array([0,
1,
2])>>>《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》■3、利用make_regression()函數(shù)生成回歸數(shù)據(jù)集sklearn.datasets模塊的函數(shù)make_regression(n_samples=100,n_features=100,*,n_informative=10,n_targets=1,bias=0.0,effective_rank=None,tail_strength=noise=0.0,shuffle=True,coef=False,random_state=None)用來生成一個隨機(jī)的回數(shù)據(jù)集。一些參數(shù)與前面介紹的同名參數(shù)作用類似。這里選擇介紹其它幾個主要參數(shù),含義如下:n_targets表示回歸目標(biāo)的個數(shù);默認(rèn)情況下,輸出的目標(biāo)是標(biāo)量。bias表示線性模型中的偏差。noise表示輸出的高斯噪聲的標(biāo)準(zhǔn)偏差。
coef表示是否返回底層線性模型的系數(shù);如果為真,則返回底層線性模型的系數(shù);默認(rèn)為False?!禤ython數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》下面給出使用make_regression()函數(shù)生成回歸數(shù)據(jù)集的簡單用法案例。>>>
from
sklearn
import
datasets>>>
regressionData
=
datasets.make_regression(n_features=3,n_informative=2,
noise=1,coef=True,
random_state=50)>>>
type(regressionData)<class
"tuple">>>>
len(regressionData)3>>>
X_features
=
regressionData[0]>>>
type(X_features)<class
"numpy.ndarray">>>>
X_features.shape(100,
3)《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》>>>
X_features[:3]array([[-1.29114517,
0.04813559,
0.74490531],[
0.0871147
,
0.74656892,
0.03426837],[-0.56727849,
0.56502181,
-1.06915842]])>>>
y_target
=
regressionData[1]>>>
type(y_target)<class
"numpy.ndarray">>>>
y_target.shape(100,)>>>
y_target[:3]array([
-57.51504589,
9.42857778,
-122.94332524])>>>
coef
=
regressionData[2]>>>
type(coef)<class
"numpy.ndarray">>>>
coef.shape(3,)>>>
coefarray([84.27222501,
0. ,
69.54685147])>>>《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》>>>
another_regressionData
=
datasets.make_regression(n_features=3,n_informative=2,
noise=1,random_state=50)>>>
len(another_regressionData)2>>>
X_features_another
=
another_regressionData[0]>>>
X_features_another[:3]array([[-1.29114517,
0.04813559,
0.74490531],[
0.0871147
,
0.74656892,
0.03426837],[-0.56727849,
0.56502181,
-1.06915842]])>>>
y_target_another
=
another_regressionData[1]>>>
y_target_another[:3]array([
-57.51504589,
9.42857778,
-122.94332524])>>>《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》8.3.4加載scikit-learn中的其它數(shù)據(jù)集■Scikit-learn中包含了一些由作者根據(jù)知識共享協(xié)議發(fā)布的JPEG樣例圖片。
sklearn.datasets.load_sample_images()加載用于圖像處理的示例圖片。
sklearn.datasets.load_sample_image(image_name)加載表示單個圖片樣本的numpy數(shù)組?!鰏klearn.datasets.load_svmlight_file(數(shù)據(jù)文件名)加載svmlight/libsvm的數(shù)據(jù)集。這種格式特別適合于稀疏數(shù)據(jù)集。參數(shù)中的數(shù)據(jù)文件可以有多個,文件名之間用逗號隔開。■是一個機(jī)器學(xué)習(xí)數(shù)據(jù)和實驗的公共存儲庫,它允許每個人上傳或下載開放的數(shù)據(jù)集。一種方式可以先下載數(shù)據(jù)文件,然后讀取數(shù)據(jù)文件。另一種方式是通過sklearn.datasets.fetch_openml()函數(shù)下載并加載數(shù)據(jù)集?!禤ython數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》8.3.5通過pandas-datareader導(dǎo)入金融數(shù)據(jù)通過pandas-datareader庫可以從Yahoo財經(jīng)、Google財經(jīng)等數(shù)據(jù)源導(dǎo)入金融數(shù)據(jù)。使用之前需要先安裝pandas-datareader庫??梢圆捎胮ip
install
pandas-datareader在線安裝。pandas-datareader.data模塊中的函數(shù)DataReader(name,data_source=None,start=None,end=None,retry_count=3,pause=0.1,session=None,api_key=None以從data_source指定的數(shù)據(jù)源讀取金融數(shù)據(jù),返回DataFrame對象。該函數(shù)的主要參數(shù)含義如下:name是字符串或字符串列表,每個字符串表示要讀取的數(shù)據(jù)集名稱代碼;如Google公司的股票代碼”GOOG”;國內(nèi)股票采用“股票代碼.股市代碼”,其中SS表示上證股票、
SZ表示深證股票。data_source表示數(shù)據(jù)源;如果從Yahoo財經(jīng)讀取數(shù)據(jù),則為“yahoo”;如果從Google財經(jīng)讀取數(shù)據(jù),則為”google”。start和end表示數(shù)據(jù)的起始和結(jié)束時間段,默認(rèn)起始時間為2010年1月1日,結(jié)束時間為今天。retry_count表示查詢請求的最大重試次數(shù),默認(rèn)為3次?!禤ython數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》下面給出DataReader()函數(shù)的部分使用案例。>>>
from
pandas_datareader
import
data>>>
gm_stock
=
data.DataReader("GM",data_source="yahoo",start="2018")>>>
type(gm_stock)<class
"pandas.core.frame.DataFrame">>>>
gm_stock.shape(709,
6)>>>
gm_stock[:5]High
Low
Open
Close
Volume
Adj
CloseDate2018-01-0241.86999941.15000241.24000241.7999996934600.038.0722122018-01-0342.95000142.20000142.20999942.82000014591600.039.0012442018-01-0444.25000043.00999843.09000044.13999917298700.040.2035262018-01-0544.63999943.95999944.50000044.0099989643300.040.0851142018-01-0844.59000043.52000044.04000144.22000113099600.040.276390《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》>>>
import
datetime>>>
start
=
datetime.datetime(2018,1,1)>>>
end
=
datetime.date.today()>>>#獲取上證股票的交易信息>>>
cBank
=
data.DataReader("601988.SS",data_source="yahoo",start=start,
end=end)>>>
cBank.shape(679,
6)>>>
cBank[:5]High
Low
Open
Close
Volume
Adj
CloseDate2018-01-02
4.05
3.93
3.983.98
414507864.03.4270522018-01-03
4.02
3.96
3.974.00
178528367.03.4442732018-01-04
4.03
3.97
4.004.00
223487209.03.4442732018-01-05
4.01
3.96
4.003.98
222938096.03.4270522018-01-08
4.02
3.98
3.984.01
226438632.03.452884《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》8.3.6通過第三方平臺API加載數(shù)據(jù)■Tushare大數(shù)據(jù)開放社區(qū)免費提供各類數(shù)據(jù),包括股票、基金、期貨、債券、外匯、行業(yè)大數(shù)據(jù)、數(shù)字貨幣行情等區(qū)塊鏈數(shù)據(jù)。用戶注冊后,生
成一個token證書。有了token后,可以非常方便地通過http、python
SDK、matlab
SDK或R語言獲取數(shù)據(jù)?!鍪褂肞ython
SDK獲取數(shù)據(jù)之前,需要先安裝Tushare庫??梢酝ㄟ^pipinstall
tushare在線安裝。各種安裝和使用方法可以參考官方文檔。這里不展開闡述。《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》8.4劃分?jǐn)?shù)據(jù)分別用于訓(xùn)練和測試在有監(jiān)督學(xué)習(xí)中,訓(xùn)練好一個模型后,在將模型用于新數(shù)據(jù)的預(yù)測之前,需要先評估模型的泛化能力,也就是模型的預(yù)測能力。由于模型中的參數(shù)是從訓(xùn)練數(shù)據(jù)中學(xué)習(xí)得到的,對訓(xùn)練數(shù)據(jù)具有更好的擬合性,從而對訓(xùn)練數(shù)據(jù)具有更準(zhǔn)確的預(yù)測能力。因此訓(xùn)練集上的預(yù)測能力不能準(zhǔn)確反映模型對新數(shù)據(jù)的泛化能力。需要使用模型學(xué)習(xí)過程中沒有使用過的新數(shù)據(jù)來測試模型的泛化能力。在給定的數(shù)據(jù)中,我們可以將數(shù)據(jù)劃分為訓(xùn)練集和測試集。利用訓(xùn)練集數(shù)據(jù)來訓(xùn)練學(xué)習(xí)模型參數(shù)。學(xué)得模型后,利用測試集數(shù)據(jù)來檢測模型的泛化能力。scikit-learn.model_selection包中的train_test_split()函數(shù)將數(shù)組或矩陣按比拆分為兩部分,一部分可用于訓(xùn)練,另一部分可用于測試。可以打亂數(shù)據(jù)后進(jìn)行劃分,也可以不打亂數(shù)據(jù)進(jìn)行劃分?!禤ython數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》函數(shù)train_test_split(*arrays,**options)中的參數(shù)arrays是具有相同長度(用len函數(shù)度量或?qū)Φ膕hape[0]值)的可索引序列,參數(shù)前面的星號(*)表示可以傳遞多個序列,但長度必須相同。options表示一些以關(guān)鍵參數(shù)形式傳遞的參數(shù),常用的有以下參數(shù):test_size為浮點數(shù)或整數(shù);如果是浮點數(shù),必須位于0和1之間,表示測試集的樣本數(shù)量占總樣本數(shù)的百
分比;如果是整數(shù),表示測試集樣本的絕對數(shù)量;如果test_size和train_size的值均為空,則test_size取0.25。train_size為浮點數(shù)或整數(shù);如果為浮點數(shù),必須位于0和1之間,表示訓(xùn)練集中的樣本數(shù)占總樣本數(shù)的百分比;如果為整數(shù),表示訓(xùn)練集樣本的絕對數(shù)量。random_state為隨機(jī)數(shù)種子;默認(rèn)為None,每次得到一個隨機(jī)的劃分;如果傳遞一個整數(shù)值,每次運行得到一個相同的劃分。shuffle為布爾值,表示劃分前是否對數(shù)據(jù)做打亂操作,默認(rèn)為True;如果shuffle為False,則stratify必須為None。stratify是類似數(shù)組的數(shù)據(jù),劃分出來的測試集與訓(xùn)練集中,各種類別的標(biāo)簽比例與stratify數(shù)組中標(biāo)簽的比例相同,方便不均衡數(shù)據(jù)集中測試集與訓(xùn)練集的劃分;如果為None,則劃分出來的標(biāo)簽比例是隨機(jī)的?!禤ython數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》據(jù)集進(jìn)行劃分的部分案例。>>>
import
numpy
as
np>>>
from
sklearn.model_selection
importtrain_test_split>>>
X
=
np.arange(15).reshape(5,3)>>>
Xarray([[
0,
1,
2],[
3,
4,
5],[
6,
7,
8],[
9,
10,
11],[12,
13,
14]])>>>
y
=
range(5)下面給出利用train_test_split()函數(shù)對數(shù)■可以對單個數(shù)組進(jìn)行劃分,參數(shù)shuffle=False表示不打亂數(shù)據(jù)集進(jìn)行劃分>>>
X_train,
X_test
=
train_test_split(X,shuffle=False)>>>
X_trainarray([[0,
1,
2],[3,
4,
5],[6,
7,
8]])>>>
X_test
array([[
9,
10,
11],[12,
13,
14]])>>>《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》也可以同時對多個數(shù)據(jù)集進(jìn)行劃分,shuffle默認(rèn)為True,打亂數(shù)據(jù)集進(jìn)行劃分。
train_size表示訓(xùn)練集的大小的整數(shù)或浮點數(shù),若為浮點數(shù),表示所占百分比。>>>
X_train,
X_test,
y_train,
y_test
=
train_test_split(X,
y,
train_size=0.6,
random_state=1)>>>
X_trainarray([[12,
13,
14],[
0,
1,
2],[
9,
10,
11]])>>>
y_train[4,
0,
3]>>>
X_testarray([[6,
7,
8],[3,
4,
5]])>>>
y_test[2,
1]>>>《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》下面案例表示對多個數(shù)據(jù)集不打亂進(jìn)行劃分。>>>
X_train,
X_test,
y_train,
y_test
=
train_test_split(X,
y,
shuffle=False,
train_size=0.6,
random_state=1)>>>
X_trainarray([[0,
1,
2],[3,
4,
5],[6,
7,
8]])>>>
X_testarray([[
9,
10,
11],[12,
13,
14]])>>>
y_train[0,
1,
2]>>>
y_test[3,
4]>>>《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》8.5
scikit-learn中機(jī)器學(xué)習(xí)的基本步驟示例■本節(jié)通過簡單的案例,讓讀者了解利用scikit-learn對數(shù)據(jù)集中數(shù)據(jù)進(jìn)行有監(jiān)督的分類與回歸學(xué)習(xí)、無監(jiān)督的聚類學(xué)習(xí)基本過程。截止目前,讀
者可能尚不了解分類、回歸和聚類的基本算法,本節(jié)的例子中直接引用
scikit-learn中的算法實現(xiàn)類,讀者只需了解從數(shù)據(jù)集中學(xué)習(xí)和預(yù)測的基本步驟。在第11至13章會對算法有相對詳細(xì)的講解?!禤ython數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》8.5.1有監(jiān)督分類學(xué)習(xí)步驟示例分類問題的目標(biāo)是根據(jù)特征值確定樣本類別(通常用標(biāo)簽值表示)。已知一組樣本數(shù)據(jù),每個樣本表示一個用一組特征數(shù)據(jù)描述的對象,并且已知這些
對象的類別(分類標(biāo)簽值已知),算法根據(jù)這組數(shù)據(jù),學(xué)習(xí)每個樣本特征數(shù)
據(jù)與類別標(biāo)簽數(shù)據(jù)的對應(yīng)關(guān)系并建立相應(yīng)的模型,然后將新數(shù)據(jù)的特征值輸
入模型中,計算新數(shù)據(jù)所對應(yīng)的標(biāo)簽值,這就是有監(jiān)督的機(jī)器學(xué)習(xí)分類過程。其中樣本類別標(biāo)簽是表示對象種類的離散值。如根據(jù)花的顏色、尺寸等屬性,預(yù)測花的種類。鳶尾花(iris)數(shù)據(jù)集是一個在機(jī)器學(xué)習(xí)領(lǐng)域經(jīng)常被用作示例的經(jīng)典數(shù)據(jù)集。安裝了scikit-learn后,系統(tǒng)中帶有該數(shù)據(jù)集。也可以從UCI機(jī)器學(xué)習(xí)數(shù)據(jù)庫等站點下載。數(shù)據(jù)集內(nèi)包含3類鳶尾花(Setosa鳶尾花、Versicolour鳶尾花、
Virginica鳶尾花)的共150條記錄,每類各50條記錄(樣本)。每條記錄分別包含4個特征和一個分類信息。四個特征值分別表示以厘米為單位的花萼長度(sepal
length)、花萼寬度(sepal
width)、花瓣長度(petal
length)和花瓣寬度(petal
width)?!禤ython數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》■【例8-2】以鳶尾花數(shù)據(jù)集為例,給出有監(jiān)督分類學(xué)習(xí)的基本步驟。程序源代碼見本書配套的“example8_2_鳶尾花分類示例.py”或“example8_2_鳶尾花分類示例.ipynb”。文件“example8_2_鳶尾花分類示例.py”是從“example8_2_鳶尾花分類示例.ipynb”中導(dǎo)出,兩者內(nèi)容和功能相同。下面分步給出基本步驟。《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》(1)準(zhǔn)備數(shù)據(jù)1)方式1:加載scikit-learn自帶數(shù)據(jù)集先使用sklearn.datasets包中的函數(shù)load_iris(*,return_X_y=False,as_frame=False)加載實驗數(shù)據(jù)。參數(shù)return_X_y為bool類型,默認(rèn)為False,返回類似于字典的Bunch類型對象;如果為True,則返回(data,target)格式的元組。as_frame參數(shù)決定返回值是否為pandas中的DataFrame或Series類型數(shù)據(jù),詳見幫助文檔。>>>
from
sklearn.datasets
import
load_iris#默認(rèn)返回Bunch類型的對象>>>
iris_data
=
load_iris()>>>
type(iris_data)<class
"sklearn.utils.Bunch">類似于字典,Bunch類型的對象可以通過key來訪問對應(yīng)的值。>>>
iris_data.keys()dict_keys(["data",
"target",
"frame",
"target_names",
"DESCR",
"feature_names",
"filename"])>>>《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》鍵data對應(yīng)的對象是描述特征的數(shù)組,一共150個元素,這里顯示前3個樣本的數(shù)據(jù)。>>>
iris_data["data"][:3]array([[5.1,
3.5,
1.4,
0.2],[4.9,
3.
,
1.4,
0.2],[4.7,
3.2,
1.3,
0.2]])>>>通過feature_names,可以查看各特征依次表示的含義。>>>
iris_data["feature_names"]["sepal
length
(cm)",
"sepal
width
(cm)",
"petal
length
(cm)",
"petal
width
(cm)"]>>>也可以通過引用屬性的方式調(diào)用Bunch對象中key所對應(yīng)的值。>>>
iris_data.feature_names["sepal
length
(cm)",
"sepal
width
(cm)",
"petal
length
(cm)",
"petal
width
(cm)"]>>>《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》鍵target對應(yīng)的對象是目標(biāo)值(類別),一共150個,依次與data中的每個元素對應(yīng)。>>>
iris_data["target"]array([0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,0,
0,
0,
0,
0,
0,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2])>>>
iris_data.target[:3]array([0,
0,
0])>>>通過target_names,可以查看各目標(biāo)值依次對應(yīng)的含義。>>>
iris_data["target_names"]array(["setosa",
"versicolor",
"virginica"],
dtype="<U10")>>>從target_names可以看出,target中的0、1、2分別表示setosa、versicolor和virginica三種鳶尾花。通過iris_data["DESCR"]查看鍵DESCR對應(yīng)的是關(guān)于該數(shù)據(jù)集的簡要描述。《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》如果加載數(shù)據(jù)的時候設(shè)置as_frame=True,那么data和frame兩個鍵對應(yīng)的都是特征數(shù)據(jù)構(gòu)成的DataFrame對象,data對應(yīng)的數(shù)據(jù)不包含target列,frame對應(yīng)的數(shù)據(jù)包含target列。鍵target對應(yīng)的是目標(biāo)值構(gòu)成的Series對象。>>>
iris_data
=
load_iris(as_frame=True)>>>
type(iris_data)<class
"sklearn.utils.Bunch">>>>
iris_data.keys()dict_keys(["data",
"target",
"frame",
"target_names",
"DESCR",
"feature_names",
"filename"])>>>iris_data["data"][:3]#顯示前3行sepal
length
(cm)
sepal
width
(cm)
petal
length
(cm)
petal
width
(cm)05.13.51.40.214.93.01.40.224.73.21.30.2《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》>>>iris_data["target"][:3]#顯示前3個樣本的標(biāo)簽0
01
02
0Name:
target,
dtype:
int32>>>iris_data["frame"][:3]#顯示前3行sepal
length
(cm)
sepal
width
(cm)
...
petal
width
(cm)
target05.13.5
...
0.2014.93.0
...
0.2024.73.2
...
0.20[3
rows
x
5
columns]>>>《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》如果導(dǎo)入數(shù)據(jù)時使用參數(shù)return_X_y=True,則返回特征數(shù)組和目標(biāo)數(shù)組構(gòu)成的元組,可以分別賦給兩個變量。這種方式下無法查看各特征的名稱和目標(biāo)數(shù)值表示的分類名稱。>>>
X,
y
=
load_iris(return_X_y=True)>>>
X[:3]array([[5.1,
3.5,
1.4,
0.2],[4.9,
3.
,
1.4,
0.2],[4.7,
3.2,
1.3,
0.2]])>>>
yarray([0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,0,
0,
0,
0,
0,
0,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2])>>>
y[:3]array([0,
0,
0])>>>《Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)》2)方式2:從UCI機(jī)器學(xué)習(xí)庫下載數(shù)據(jù)集并加載用搜索引擎搜索“UCI機(jī)器學(xué)習(xí)庫”,進(jìn)入“UCI
Machine
Learning
Repository”頁面。下載Iris數(shù)據(jù)集,得到iris.data數(shù)據(jù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 五年級下安全試卷及答案
- 電子設(shè)備抵押合同
- 《泡沫消防車》課件
- 《調(diào)節(jié)血糖市場》課件
- 美食廣場 吃遍全球美味
- 雙手除皺的有效方法
- 制作酵素半年多總結(jié)模版
- 汽車GPS導(dǎo)航系統(tǒng)使用技巧
- 區(qū)塊鏈在商業(yè)合同執(zhí)行中的安全管理及透明度分析
- 區(qū)塊鏈技術(shù)下的教育資金審計變革
- 第18課《井岡翠竹》課件-2024-2025學(xué)年統(tǒng)編版語文七年級下冊
- 公立醫(yī)院成本核算指導(dǎo)手冊
- MOOC 中醫(yī)與辨證-暨南大學(xué) 中國大學(xué)慕課答案
- 執(zhí)行異議及復(fù)議課件
- 安全生產(chǎn)管理組織機(jī)構(gòu)設(shè)置圖
- 【大學(xué)課件】色彩構(gòu)成
- 智能健身鏡行業(yè)分析及案例
- 中聯(lián)HIS系統(tǒng)掛號收費 操 作 說 明
- HIT(肝素誘導(dǎo)的血小板減少癥)課件
- 焊接件檢驗合格率統(tǒng)計表
- Mayo肘關(guān)節(jié)功能評分
評論
0/150
提交評論