




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Python程序設計
第十二章機器學習本章知識點導圖
本章只是帶領大家入門,并沒有涉及機器學習的全部內容,把機器學習的重要步驟掌握了,也就算達到了本章的目的,正所謂師傅領進門,修行在個人。本章歸納的機器學習步驟如下:導入數據數據處理訓練模型評估算法做出預測12.1入門案例56327816024089916943價格(萬元)906512527231214715910978機器學習的實現步驟其實也很固定,先來看個例子。案例:假設房子的價格只跟面積有關,下面給出了一些房子的面積和價格之間的關系數據,如表12-1所示,請估計出40平米的房屋價格。表12-1房屋面積與價格之間的關系數據可以先將數據的分布情況散點圖可視化,如右圖所示,大概是一個線性關系,即y=ax+b。對于這種線性預測問題,在機器學習里已經有人給出了很好的解決方案,并編寫了完整的程序代碼——線性回歸模型,我們只需要導入sklearn.linear_model中的LinearRegression調用函數即可。
針對該數據分布情況和所提出的問題,可以使用下面的程序進行建模和預測。
導入相應的庫。fromsklearn.linear_modelimportLinearRegressionimportmatplotlib.pyplotaspltimportnumpyasnpplt.rcParams['font.family']='MicrosoftYaHei'plt.rcParams['font.sans-serif']=['MicrosoftYaHei’]plt.rcParams['font.size']=16錄入數據,并對數據進行處理和探索。x=np.array([56,32,78,160,240,89,91,69,43])y=np.array([90,65,125,272,312,147,159,109,78])
#數據處理,并畫圖進行數據探索X=x.reshape(-1,1)#將數據變為1列Y=y.reshape(-1,1)plt.figure(figsize=(10,6))#初始化圖像窗口plt.scatter(X,Y,s=50)#原始數據的散點圖plt.title("原始數據散點圖")plt.show()#顯示如上圖建立模型并訓練模型。model=LinearRegression()#建立模型model.fit(X,Y)#訓練模型模型預測。將測試數據代入,看看預測結果情況。x1=np.array([40,]).reshape(-1,1)#處理預測數據x1_pre=model.predict(np.array(x1))#預測面積為40平米時房價print(x1_pre)輸出結果為:array([[79.59645966]])
至此,我們已經通過LinearRegression模型,對于給定的數據求出了面積為40平米的大概房價為79.5965萬元。我們不僅預測出來40平米房價的大概價格,其實我們還可以把這個線性關系中的參數a、b也求出來。具體代碼如下。b=ercept_#求截距ba=model.coef_#求斜率aprint("a=%d"%a,"\n","b=%d"%b)輸出結果為:a=1b=28我們可以將模擬出來的直線在圖上畫出來,同時將原來的數據散點圖也畫上,并將40平米的房屋價格用紅色的點在圖中標記出來,代碼如下。運行程序后如圖所示,能夠很清晰地看出40平米的房屋價格是符合前面給出的數據模擬的直線的。#定義畫布,并把原數據散點圖畫出來plt.figure(figsize=(10,8))plt.scatter(X,Y)#原始數據散點圖
#畫出模擬的直線圖y=a*X+bplt.plot(X,y)
#畫出40平米的房屋價格數據點,并用紅色進行標注y1=a*x1+bplt.scatter(x1,y1,color='r')plt.show()以上是對一元線性回歸的實現方法。但在現實中,房價的影響因素太多,不僅跟面積有關,還跟地理位置有關,跟小區容積率等等都有關,這就要用到多元線性回歸進行擬合了。在機器學習中,常用到的學習方法除了一元線性回歸、多元線性回歸模型,還有邏輯回歸、聚類、決策樹、隨機向量、支持向量機、樸素貝葉斯等模型,這些模型的使用基本類似,都有以下的步驟。以上面的一元線性回歸模型為例:1.整理數據:數據預處理和探索,將數據處理為適合模型使用的數據格式2.建立模型:model=LinearRegression()3.訓練模型:model.fit(x,y)4.模型預測:model.predict([[a]])5.評價模型:利用可視化方式直觀的評價模型的預測效果在實際的機器學習模型應用過程中,數據預處理與探索及特征工程部分是工作量最大的任務,所以在機器學習的模型使用過程中,將對數據進行充分理解、將數據整理為合適的數據格式,以及從數據中提取有用的特征,往往會消耗大量的時間。最后是對建立的模型進行有效評估。12.2監督學習和無監督學習機器學習分為監督學習、無監督學習、半監督學習或者強化學習等。深度學習只是機器學習的一個分支。所謂監督學習是指從給定的訓練數據集中學習出一個函數(模型參數),當給出新的數據時,可以根據這個函數預測結果。也就是說,訓練集和測試集中每一條數據都是帶有明確的結果(標簽),比如現在有一些病人的癥狀信息,也給出了這些病人最后確診是什么病,通過這些信息放到模型中訓練,當新來一個病人時,把他的癥狀信息放入模型,模型會給出預測結果,病人可能是什么病。無監督學習就是數據中給出明確的結果,通過計算機自己去找相應的規律對數據進行分類,對于新給定的數據,按照前面找到的規律進行歸類。如我們給了一箱子積木,只知道一些是三角形,另一些是方形。通過模型訓練學習,自動將積木分為了三角形和方形。當我們再給定一個新的積木時,它會自動給我們歸類到三角形或方形當中去。12.2.1監督學習
我們來看一個監督學習的例子。
問題描述:現在有768個糖尿病人的病例信息,如表12-2。每個病人的信息都記錄了同樣的8個方面信息(也叫屬性或者特征),包括:懷孕次數、口服葡萄糖耐量試驗中2小時的血漿葡萄糖濃度(mg/dl)、舒張壓(毫米汞柱)、三頭肌皮褶厚度(mm)、2小時血清胰島素(μU/ml)、體重指數(體重kg/(身高m)^2)、糖尿病譜系功能、年齡(歲)、是否陽性。該數據集除了這8個描述患者醫療細節的信息外,還記錄了一個用于指示患者是否會在5年內患上糖尿病的確診信息。當新來一個病人時,能否從給定的768個病人的信息中,預測該患者是否患有糖尿病?表12-2部分糖尿病人的特征數據懷孕次數口服葡萄糖耐量試驗中2小時的血漿葡萄糖濃度(mg/dl)舒張壓(毫米汞柱)三頭肌皮褶厚度(mm)2小時血清胰島素(μU/ml)體重指數(體重kg/(身高m)^2)糖尿病譜系功能年齡(歲)是否陽性61487235033.60.6275011856629026.60.3513108183640023.30.67232118966239428.10.1672100137403516843.12.2883315116740025.60.201300378503288310.248261
該數據是一個二分類問題,即判斷該病人是否患有糖尿病,是即為陽性(1),否即為陰性(0)。
對于該二分類問題,我們可以采用決策樹、邏輯回歸、隨機森林、XGBoost、lightGBM、catBoost等模型來處理。我們這里采用XGBoost算法建模該問題。
首先我們導入數據。importnumpyasnppath=r"D:\python\14\pima-indians-diabetes.csv"dataset=np.loadtxt(path,delimiter=",",skiprows=1)我們需要將數據集的特征和對應的結果(標簽)分開,即將數據的列分成輸入特征(X)和輸出標簽(Y)。因為模型是通過給定的數據訓練后才符合我們要的分類標準。因此我們必須將X和Y都拆分為訓練集和測試集。訓練集將用于訓練XGBoost模型,測試集將用于了解該模型的精度。在拆分數據集之前,我們先拿一條數據出來,當作新進來的病人數據,以查看我們模型預測的結果。這里我們取最后一條數據作為新來的病人數據。X_new=dataset[-1,0:8]Y_new=dataset[-1,8]所以我們現在的數據集輸入特征X和輸出標簽Y都是767條。代碼如下。X=dataset[:-1,0:8]Y=dataset[:-1,8]print(len(X),len(Y))
拆分數據我們可以使用scikit-learn庫中的train_test_split()函數,該函數可以為我們自動劃分數據為訓練集和測試集。我們還為該函數添加了兩個參數,一個是隨機數生成器的種子值23,這個值可以理解為沒有什么實際的意義,隨便指定,主要是便于以后每次執行這個例子時,我們總是得到相同的數據分割;另一個是劃分比例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()函數創建模型,并用fit()函數通過訓練集來訓練或擬合我們的模型。當然也可以在構造的XGBClassifier()函數中添加一些用于訓練模型的參數。在這里,我們使用默認的參數值。fromxgboostimportXGBClassifiermodel=XGBClassifier()model.fit(X_train,y_train)這樣,我們的模型就訓練好了。那么我們的模型預測能力到底怎么樣呢?這就需用測試集了。因為我們的測試集的每一條數據都有標簽(結果),那我們就可以將每一條數據測試的結果都進行記錄,最后對正確的次數做個百分比,這個百分比就是我們的正確率。我們使用測試集對訓練好的模型進行了測試,通過預測出來的值(結果)與我們真實的值(標簽)進行比較來評估模型的性能。為此,我們將使用scikit-learn中內置的accuracy_score()函數計算我們的正確率。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行代碼也可以用一行代碼來實現,結果是一樣的。model.score(X_test,y_test)#測試精確度
現在,我們可以預測新的病例X_new是否患有糖尿病了。我們繼續使用model.predict()來預測。
這里我們首先需要對數據進行預處理,因為我們前面預測數據時不是一條一條的數據輸入,而是將測試集整體輸入,而我們這里新來的病例不是一個數據集,而是只有一條信息的數據,所以從形式上我們首先要符合輸入的數據形式。我們先來看我們的測試集的數據形式。print(X_test,"\n______________\n",X_new)X_test和X_new數據用下劃線隔開如下:[[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.]通過輸出的數據形式我們發現X_test的形式是每條數據用一個列表表示,再將所有的數據用一個大列表包裹起來,數據形式是列表內的每個元素仍然是列表,即列表套列表。那么如果只有一條數據,那應該也是列表套列表的形式,即列表里只有一個列表元素。而我們的X_new只有一層列表,所以我們需要對新來的這條病人數據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%。當然,對于這個模型的正確率還有很大的提升空間,這就是后話了,需要我們對參數進行設置了——調參,還有可能需要我們對數據進行標準化,以及對數據特征進行選取等工作。如本例中,病人的特征信息有8個,是不是每個特征有用呢?如有的特征里有姓名,很顯然叫什么名字與得病是沒有關系的。所以我們可以對這8個特征的重要性進行展示,可用條形圖來表示,如圖12-3所示。frommatplotlibimportpyplotfromxgboostimportplot_importanceplot_importance(model)pyplot.show()從圖12-3中可以看出,f6、f5、f1的重要性相比于其他幾個指標要重要的多。其中f0~f7表示按順序的8個特征。圖12-3特征的重要性程度值得注意的是,有些模型并不是靠調參就能解決問題的,這就像我們常說的,鐵棒能否磨成針取決于材料,木頭是永遠磨不成針的。所以一般的機器學習模型都有一個模型評估,可以多選擇幾個模型來進行比較。12.2.2無監督學習無監督學習的一個典型例子就是聚類。我們先造一些數據,并把這些數據用散點圖畫出來。這些數據我們在造的時候其實已經暗中分成了兩組,第一簇集中在橫坐標[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])接下來對我們造的數據data進行聚類,我們使用sklearn.cluster中的KMeans模型。KMeans()需要提供初始值n,這個n是我們指定要分成幾個類。這里我們假設分成2類。fromsklearn.clusterimportKMeans
model=KMeans(n_clusters=2)model.fit(data)圖12-4兩簇散點圖訓練完成之后,我們可以查看我們的原始數據data都分在了哪個簇里。model.labels_#每個樣本的所屬中心標簽索引,同predict(X)#model.predict(data)#預測數據集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])這跟我們造的數據的預設一致,它把橫坐標在[1,30]之間的數據歸為了一類,標簽為1,橫坐標在[41,70]之間歸為了另一類,標簽為0。我們再隨便找幾個數據測試一下。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、整理數據:2、建立模型:model=模型函數()3、訓練模型:model.fit(x,y)4、模型預測:model.predict([[a]])
其他的算法如SVM、KNN以及隨機森林、Adaboost和GBRT等等,大部分只需替換以上案例代碼中的導入相應的模塊和實例化模型兩部分即可。替換內容對應如下表。導入模塊實例化模型邏輯回歸fromsklearn.linear_modelimportlogsticmode
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 拆遷補償款分割與離婚房產權益確認及分配協議
- 同傳租賃合同爭議管轄補充協議
- 家居清潔濃縮原液綠色環保認證與市場推廣協議
- 中小學心理輔導課程實施計劃
- 網紅炸雞店區域分銷權及秘制醬料授權協議
- 國際海事保險仲裁條款合同
- 智能房產租賃信息服務平臺合作協議
- 小學科學知識評估與教學計劃
- 人教版八年級數學下冊教學計劃評估標準
- 輸血錯誤風險評估流程及其應急預案
- 藍色大氣商務商業計劃書PPT模板
- 青春紅綠燈教學設計中小學心理健康心理游戲腳本
- 蘇教版二年級(下冊)科學全冊單元測試卷含期中期末(有答案)
- 《城鎮土地使用稅納稅申報表》
- 三年級數學下冊口算脫式豎式練習題
- 17025實驗室體系
- 大榆樹溝防洪治理工程初步設計報告
- 8D報告培訓教材(共30頁).ppt
- 屋面及防水工程工程量計算PPT課件
- 逆作法與順作法施工方案比較
- 植物分類學-菊科.ppt
評論
0/150
提交評論