




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
Python程序設計
第十二章機器學習本章知識點導圖
本章只是帶領大家入門,并沒有涉及機器學習的全部內(nèi)容,把機器學習的重要步驟掌握了,也就算達到了本章的目的,正所謂師傅領進門,修行在個人。本章歸納的機器學習步驟如下:導入數(shù)據(jù)數(shù)據(jù)處理訓練模型評估算法做出預測12.1入門案例56327816024089916943價格(萬元)906512527231214715910978機器學習的實現(xiàn)步驟其實也很固定,先來看個例子。案例:假設房子的價格只跟面積有關,下面給出了一些房子的面積和價格之間的關系數(shù)據(jù),如表12-1所示,請估計出40平米的房屋價格。表12-1房屋面積與價格之間的關系數(shù)據(jù)可以先將數(shù)據(jù)的分布情況散點圖可視化,如右圖所示,大概是一個線性關系,即y=ax+b。對于這種線性預測問題,在機器學習里已經(jīng)有人給出了很好的解決方案,并編寫了完整的程序代碼——線性回歸模型,我們只需要導入sklearn.linear_model中的LinearRegression調(diào)用函數(shù)即可。
針對該數(shù)據(jù)分布情況和所提出的問題,可以使用下面的程序進行建模和預測。
導入相應的庫。fromsklearn.linear_modelimportLinearRegressionimportmatplotlib.pyplotaspltimportnumpyasnpplt.rcParams['font.family']='MicrosoftYaHei'plt.rcParams['font.sans-serif']=['MicrosoftYaHei’]plt.rcParams['font.size']=16錄入數(shù)據(jù),并對數(shù)據(jù)進行處理和探索。x=np.array([56,32,78,160,240,89,91,69,43])y=np.array([90,65,125,272,312,147,159,109,78])
#數(shù)據(jù)處理,并畫圖進行數(shù)據(jù)探索X=x.reshape(-1,1)#將數(shù)據(jù)變?yōu)?列Y=y.reshape(-1,1)plt.figure(figsize=(10,6))#初始化圖像窗口plt.scatter(X,Y,s=50)#原始數(shù)據(jù)的散點圖plt.title("原始數(shù)據(jù)散點圖")plt.show()#顯示如上圖建立模型并訓練模型。model=LinearRegression()#建立模型model.fit(X,Y)#訓練模型模型預測。將測試數(shù)據(jù)代入,看看預測結果情況。x1=np.array([40,]).reshape(-1,1)#處理預測數(shù)據(jù)x1_pre=model.predict(np.array(x1))#預測面積為40平米時房價print(x1_pre)輸出結果為:array([[79.59645966]])
至此,我們已經(jīng)通過LinearRegression模型,對于給定的數(shù)據(jù)求出了面積為40平米的大概房價為79.5965萬元。我們不僅預測出來40平米房價的大概價格,其實我們還可以把這個線性關系中的參數(shù)a、b也求出來。具體代碼如下。b=ercept_#求截距ba=model.coef_#求斜率aprint("a=%d"%a,"\n","b=%d"%b)輸出結果為:a=1b=28我們可以將模擬出來的直線在圖上畫出來,同時將原來的數(shù)據(jù)散點圖也畫上,并將40平米的房屋價格用紅色的點在圖中標記出來,代碼如下。運行程序后如圖所示,能夠很清晰地看出40平米的房屋價格是符合前面給出的數(shù)據(jù)模擬的直線的。#定義畫布,并把原數(shù)據(jù)散點圖畫出來plt.figure(figsize=(10,8))plt.scatter(X,Y)#原始數(shù)據(jù)散點圖
#畫出模擬的直線圖y=a*X+bplt.plot(X,y)
#畫出40平米的房屋價格數(shù)據(jù)點,并用紅色進行標注y1=a*x1+bplt.scatter(x1,y1,color='r')plt.show()以上是對一元線性回歸的實現(xiàn)方法。但在現(xiàn)實中,房價的影響因素太多,不僅跟面積有關,還跟地理位置有關,跟小區(qū)容積率等等都有關,這就要用到多元線性回歸進行擬合了。在機器學習中,常用到的學習方法除了一元線性回歸、多元線性回歸模型,還有邏輯回歸、聚類、決策樹、隨機向量、支持向量機、樸素貝葉斯等模型,這些模型的使用基本類似,都有以下的步驟。以上面的一元線性回歸模型為例:1.整理數(shù)據(jù):數(shù)據(jù)預處理和探索,將數(shù)據(jù)處理為適合模型使用的數(shù)據(jù)格式2.建立模型:model=LinearRegression()3.訓練模型:model.fit(x,y)4.模型預測:model.predict([[a]])5.評價模型:利用可視化方式直觀的評價模型的預測效果在實際的機器學習模型應用過程中,數(shù)據(jù)預處理與探索及特征工程部分是工作量最大的任務,所以在機器學習的模型使用過程中,將對數(shù)據(jù)進行充分理解、將數(shù)據(jù)整理為合適的數(shù)據(jù)格式,以及從數(shù)據(jù)中提取有用的特征,往往會消耗大量的時間。最后是對建立的模型進行有效評估。12.2監(jiān)督學習和無監(jiān)督學習機器學習分為監(jiān)督學習、無監(jiān)督學習、半監(jiān)督學習或者強化學習等。深度學習只是機器學習的一個分支。所謂監(jiān)督學習是指從給定的訓練數(shù)據(jù)集中學習出一個函數(shù)(模型參數(shù)),當給出新的數(shù)據(jù)時,可以根據(jù)這個函數(shù)預測結果。也就是說,訓練集和測試集中每一條數(shù)據(jù)都是帶有明確的結果(標簽),比如現(xiàn)在有一些病人的癥狀信息,也給出了這些病人最后確診是什么病,通過這些信息放到模型中訓練,當新來一個病人時,把他的癥狀信息放入模型,模型會給出預測結果,病人可能是什么病。無監(jiān)督學習就是數(shù)據(jù)中給出明確的結果,通過計算機自己去找相應的規(guī)律對數(shù)據(jù)進行分類,對于新給定的數(shù)據(jù),按照前面找到的規(guī)律進行歸類。如我們給了一箱子積木,只知道一些是三角形,另一些是方形。通過模型訓練學習,自動將積木分為了三角形和方形。當我們再給定一個新的積木時,它會自動給我們歸類到三角形或方形當中去。12.2.1監(jiān)督學習
我們來看一個監(jiān)督學習的例子。
問題描述:現(xiàn)在有768個糖尿病人的病例信息,如表12-2。每個病人的信息都記錄了同樣的8個方面信息(也叫屬性或者特征),包括:懷孕次數(shù)、口服葡萄糖耐量試驗中2小時的血漿葡萄糖濃度(mg/dl)、舒張壓(毫米汞柱)、三頭肌皮褶厚度(mm)、2小時血清胰島素(μU/ml)、體重指數(shù)(體重kg/(身高m)^2)、糖尿病譜系功能、年齡(歲)、是否陽性。該數(shù)據(jù)集除了這8個描述患者醫(yī)療細節(jié)的信息外,還記錄了一個用于指示患者是否會在5年內(nèi)患上糖尿病的確診信息。當新來一個病人時,能否從給定的768個病人的信息中,預測該患者是否患有糖尿???表12-2部分糖尿病人的特征數(shù)據(jù)懷孕次數(shù)口服葡萄糖耐量試驗中2小時的血漿葡萄糖濃度(mg/dl)舒張壓(毫米汞柱)三頭肌皮褶厚度(mm)2小時血清胰島素(μU/ml)體重指數(shù)(體重kg/(身高m)^2)糖尿病譜系功能年齡(歲)是否陽性61487235033.60.6275011856629026.60.3513108183640023.30.67232118966239428.10.1672100137403516843.12.2883315116740025.60.201300378503288310.248261
該數(shù)據(jù)是一個二分類問題,即判斷該病人是否患有糖尿病,是即為陽性(1),否即為陰性(0)。
對于該二分類問題,我們可以采用決策樹、邏輯回歸、隨機森林、XGBoost、lightGBM、catBoost等模型來處理。我們這里采用XGBoost算法建模該問題。
首先我們導入數(shù)據(jù)。importnumpyasnppath=r"D:\python\14\pima-indians-diabetes.csv"dataset=np.loadtxt(path,delimiter=",",skiprows=1)我們需要將數(shù)據(jù)集的特征和對應的結果(標簽)分開,即將數(shù)據(jù)的列分成輸入特征(X)和輸出標簽(Y)。因為模型是通過給定的數(shù)據(jù)訓練后才符合我們要的分類標準。因此我們必須將X和Y都拆分為訓練集和測試集。訓練集將用于訓練XGBoost模型,測試集將用于了解該模型的精度。在拆分數(shù)據(jù)集之前,我們先拿一條數(shù)據(jù)出來,當作新進來的病人數(shù)據(jù),以查看我們模型預測的結果。這里我們?nèi)∽詈笠粭l數(shù)據(jù)作為新來的病人數(shù)據(jù)。X_new=dataset[-1,0:8]Y_new=dataset[-1,8]所以我們現(xiàn)在的數(shù)據(jù)集輸入特征X和輸出標簽Y都是767條。代碼如下。X=dataset[:-1,0:8]Y=dataset[:-1,8]print(len(X),len(Y))
拆分數(shù)據(jù)我們可以使用scikit-learn庫中的train_test_split()函數(shù),該函數(shù)可以為我們自動劃分數(shù)據(jù)為訓練集和測試集。我們還為該函數(shù)添加了兩個參數(shù),一個是隨機數(shù)生成器的種子值23,這個值可以理解為沒有什么實際的意義,隨便指定,主要是便于以后每次執(zhí)行這個例子時,我們總是得到相同的數(shù)據(jù)分割;另一個是劃分比例test_size,一般訓練集和測試集的劃分標準在3:1左右,即測試集占0.25。fromsklearn.model_selectionimporttrain_test_splitX_train,X_test,y_train,y_test=train_test_split(X,Y,test_size=0.25,random_state=23)接下來我們訓練模型。用于分類的XGBoost模型使用XGBClassifier()函數(shù)創(chuàng)建模型,并用fit()函數(shù)通過訓練集來訓練或擬合我們的模型。當然也可以在構造的XGBClassifier()函數(shù)中添加一些用于訓練模型的參數(shù)。在這里,我們使用默認的參數(shù)值。fromxgboostimportXGBClassifiermodel=XGBClassifier()model.fit(X_train,y_train)這樣,我們的模型就訓練好了。那么我們的模型預測能力到底怎么樣呢?這就需用測試集了。因為我們的測試集的每一條數(shù)據(jù)都有標簽(結果),那我們就可以將每一條數(shù)據(jù)測試的結果都進行記錄,最后對正確的次數(shù)做個百分比,這個百分比就是我們的正確率。我們使用測試集對訓練好的模型進行了測試,通過預測出來的值(結果)與我們真實的值(標簽)進行比較來評估模型的性能。為此,我們將使用scikit-learn中內(nèi)置的accuracy_score()函數(shù)計算我們的正確率。fromsklearn.metricsimportaccuracy_scorey_pred=model.predict(X_test)predictions=[round(value)forvalueiny_pred]accuracy=accuracy_score(y_test,predictions)print("Accuracy:%.2f%%"%(accuracy*100.0))這里我們看到輸出結果為:Accuracy:76.04%。Accuracy:76.04%其實,上面計算正確率的5行代碼也可以用一行代碼來實現(xiàn),結果是一樣的。model.score(X_test,y_test)#測試精確度
現(xiàn)在,我們可以預測新的病例X_new是否患有糖尿病了。我們繼續(xù)使用model.predict()來預測。
這里我們首先需要對數(shù)據(jù)進行預處理,因為我們前面預測數(shù)據(jù)時不是一條一條的數(shù)據(jù)輸入,而是將測試集整體輸入,而我們這里新來的病例不是一個數(shù)據(jù)集,而是只有一條信息的數(shù)據(jù),所以從形式上我們首先要符合輸入的數(shù)據(jù)形式。我們先來看我們的測試集的數(shù)據(jù)形式。print(X_test,"\n______________\n",X_new)X_test和X_new數(shù)據(jù)用下劃線隔開如下:[[5.88.78....27.60.25837.][13.104.72....31.20.46538.][1.116.70....27.40.20421.]...[4.128.70....34.30.30324.][7.103.66....39.10.34431.][2.120.54....26.80.45527.]]______________[1.93.70.31.0.30.40.31523.]通過輸出的數(shù)據(jù)形式我們發(fā)現(xiàn)X_test的形式是每條數(shù)據(jù)用一個列表表示,再將所有的數(shù)據(jù)用一個大列表包裹起來,數(shù)據(jù)形式是列表內(nèi)的每個元素仍然是列表,即列表套列表。那么如果只有一條數(shù)據(jù),那應該也是列表套列表的形式,即列表里只有一個列表元素。而我們的X_new只有一層列表,所以我們需要對新來的這條病人數(shù)據(jù)X_new再套一層列表。Y_pred=model.predict(np.array([X_new]))print("預測結果為:%s"%Y_pred,"\n","真實結果為%s"%Y_new)輸出結果為:0預測結果為:[0.]真實結果為0.0我們的真實結果(標簽)也為0,說明預測結果為陰性,其正確率為76.04%。當然,對于這個模型的正確率還有很大的提升空間,這就是后話了,需要我們對參數(shù)進行設置了——調(diào)參,還有可能需要我們對數(shù)據(jù)進行標準化,以及對數(shù)據(jù)特征進行選取等工作。如本例中,病人的特征信息有8個,是不是每個特征有用呢?如有的特征里有姓名,很顯然叫什么名字與得病是沒有關系的。所以我們可以對這8個特征的重要性進行展示,可用條形圖來表示,如圖12-3所示。frommatplotlibimportpyplotfromxgboostimportplot_importanceplot_importance(model)pyplot.show()從圖12-3中可以看出,f6、f5、f1的重要性相比于其他幾個指標要重要的多。其中f0~f7表示按順序的8個特征。圖12-3特征的重要性程度值得注意的是,有些模型并不是靠調(diào)參就能解決問題的,這就像我們常說的,鐵棒能否磨成針取決于材料,木頭是永遠磨不成針的。所以一般的機器學習模型都有一個模型評估,可以多選擇幾個模型來進行比較。12.2.2無監(jiān)督學習無監(jiān)督學習的一個典型例子就是聚類。我們先造一些數(shù)據(jù),并把這些數(shù)據(jù)用散點圖畫出來。這些數(shù)據(jù)我們在造的時候其實已經(jīng)暗中分成了兩組,第一簇集中在橫坐標[1,30]之間,第二簇的橫坐標在[41,70]之間。我們把散點圖畫出來,如圖12-4所示。importnumpyasnpimportpandasaspdimportmatplotlib.pyplotasplt
data=pd.DataFrame(list(zip(np.arange(1,30,0.5),np.random.randint(1,15,58)))+list(zip(np.arange(41,70,0.5),np.random.randint(10,25,58))))plt.scatter(data[0],data[1])接下來對我們造的數(shù)據(jù)data進行聚類,我們使用sklearn.cluster中的KMeans模型。KMeans()需要提供初始值n,這個n是我們指定要分成幾個類。這里我們假設分成2類。fromsklearn.clusterimportKMeans
model=KMeans(n_clusters=2)model.fit(data)圖12-4兩簇散點圖訓練完成之后,我們可以查看我們的原始數(shù)據(jù)data都分在了哪個簇里。model.labels_#每個樣本的所屬中心標簽索引,同predict(X)#model.predict(data)#預測數(shù)據(jù)集X中每個樣本所屬的聚類中心索引輸出結果為:array([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,1,1,1,1,1,1,1,1,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,0,0,0,0,0,0,0,0])這跟我們造的數(shù)據(jù)的預設一致,它把橫坐標在[1,30]之間的數(shù)據(jù)歸為了一類,標簽為1,橫坐標在[41,70]之間歸為了另一類,標簽為0。我們再隨便找?guī)讉€數(shù)據(jù)測試一下。print(model.predict([(1.0,14)]),\model.predict([(62,23)]),\model.predict([(36,10)]))輸出的結果為:[1][0][0]這表明(1,14)歸為了標簽為1的簇,(62,23)和(36,10)歸為了標簽為0的簇。12.3機器學習的幾種常見算法通過前面的案例我們可以看出,機器學習的使用方法大同小異,幾乎都有相同的步驟:1、整理數(shù)據(jù):2、建立模型:model=模型函數(shù)()3、訓練模型:model.fit(x,y)4、模型預測:model.predict([[a]])
其他的算法如SVM、KNN以及隨機森林、Adaboost和GBRT等等,大部分只需替換以上案例代碼中的導入相應的模塊和實例化模型兩部分即可。替換內(nèi)容對應如下表。導入模塊實例化模型邏輯回歸fromsklearn.linear_modelimportlogsticmode
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工程項目各階段投資管理的主要內(nèi)容
- pe塑料管施工方案
- 2025年奶制品行業(yè)資訊:美國對加拿大奶制品征收關稅引發(fā)市場波動
- 2024年三季度報湖南地區(qū)A股總資產(chǎn)周轉天數(shù)排名前十大上市公司
- 慈溪防滑地坪施工方案
- 河道清理工程施工方案
- 磚砌石墩施工方案
- 油罐防腐保溫施工方案
- 小橋涵施工方案
- 低壓管道施工方案
- 2023年全國醫(yī)學考博英語試題
- 專業(yè)技術人員職務聘任書
- GB/T 25429-2019石油天然氣鉆采設備鉆具止回閥
- 新版基本公共衛(wèi)生服務健康教育培訓課件
- 六年級上冊音樂課件 《校園小戲迷》人音版
- 2023版北京協(xié)和醫(yī)院重癥醫(yī)學科診療常規(guī)
- 千里江山圖解析課件
- 《現(xiàn)代漢語常用字表》3500個漢字
- 道路通行能力計算題
- 經(jīng)濟學基礎完整版ppt-全體教學教程課件最新
- JJF(湘) 09-2018 純水-超純水系統(tǒng)監(jiān)測儀表(電導率)計量校準規(guī)范-(高清現(xiàn)行)
評論
0/150
提交評論