版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
使用k近鄰算法實(shí)現(xiàn)分類與回歸項(xiàng)目4項(xiàng)目目標(biāo)知識(shí)目標(biāo)掌握k近鄰算法解決分類問題的基本原理。掌握k近鄰算法解決回歸問題的基本原理。了解k近鄰算法的常見問題及解決方法。掌握k近鄰算法的Sklearn實(shí)現(xiàn)方法。技能目標(biāo)能夠使用k近鄰算法訓(xùn)練分類模型。能夠使用k近鄰算法訓(xùn)練回歸模型。能夠編寫程序,尋找最優(yōu)的k值。素養(yǎng)目標(biāo)了解科技前沿新應(yīng)用,開闊視野,抓住機(jī)遇,展現(xiàn)新作為。增強(qiáng)創(chuàng)新意識(shí),培養(yǎng)探究精神。項(xiàng)目導(dǎo)入小旌了解到k近鄰算法也能實(shí)現(xiàn)分類和回歸,于是,他決定利用葡萄酒數(shù)據(jù)集(下載網(wǎng)址/ml/datasets/Wine)訓(xùn)練k近鄰分類模型,并對這個(gè)模型的性能進(jìn)行評(píng)估。該數(shù)據(jù)集記錄了意大利同一地區(qū)種植的葡萄釀制的3種類型的葡萄酒,數(shù)據(jù)集中共有178條數(shù)據(jù),每條數(shù)據(jù)包含13個(gè)特征變量和1個(gè)類別值。項(xiàng)目導(dǎo)入其中,特征變量為每組葡萄酒經(jīng)過化學(xué)分析后提取的13種成分,類別值記錄了葡萄酒的3個(gè)類別,分別用1、2、3表示,部分?jǐn)?shù)據(jù)如表4-1所示。項(xiàng)目導(dǎo)入表4-1葡萄酒數(shù)據(jù)集(部分)1234567891011121314114.231.712.4315.61272.83.06.282.295.641.043.921065113.21.782.1411.21002.652.76.261.284.381.053.41050113.162.362.6718.61012.83.24.32.815.681.033.171185……………………………………212.37.941.3610.6881.98.57.28.421.951.051.82520212.331.12.28161012.051.09.63.413.271.251.67680212.641.362.0216.81002.021.41.53.625.75.981.59450……………………………………312.861.352.32181221.511.25.21.944.1.761.29630312.882.992.4201041.31.22.24.835.4.741.42530312.812.312.424981.151.09.27.835.7.661.36560項(xiàng)目導(dǎo)入項(xiàng)目分析按照項(xiàng)目要求,使用k近鄰算法對葡萄酒進(jìn)行分類的步驟分解如下。第1步:數(shù)據(jù)準(zhǔn)備。使用Pandas讀取葡萄酒數(shù)據(jù)并為數(shù)據(jù)集指定列名稱,然后分別提取數(shù)據(jù)集的特征變量與標(biāo)簽。第2步:數(shù)據(jù)清洗。通過畫箱形圖找到數(shù)據(jù)集中的異常數(shù)據(jù),并對異常數(shù)據(jù)進(jìn)行處理,得到新的數(shù)據(jù)集文件。第3步:數(shù)據(jù)標(biāo)準(zhǔn)化處理。導(dǎo)入新生成的數(shù)據(jù)集文件,并使用z-score標(biāo)準(zhǔn)化方法對數(shù)據(jù)集進(jìn)行標(biāo)準(zhǔn)化處理,然后將數(shù)據(jù)集拆分為訓(xùn)練集與測試集。第4步:k值的選擇。使用交叉驗(yàn)證法選擇最優(yōu)的k值,并使用Matplotlib繪制k取不同值時(shí),預(yù)測誤差率的變化曲線圖。第5步:訓(xùn)練與評(píng)估模型。使用k近鄰算法訓(xùn)練模型,并對模型進(jìn)行評(píng)估,輸出預(yù)測準(zhǔn)確率,以及測試集的預(yù)測標(biāo)簽值與真實(shí)標(biāo)簽值。項(xiàng)目分析使用k近鄰算法訓(xùn)練基于葡萄酒數(shù)據(jù)集的分類模型,需要先理解k近鄰算法的基本原理。本項(xiàng)目將對相關(guān)知識(shí)進(jìn)行介紹,包括k近鄰算法解決分類與回歸問題的基本原理,k近鄰算法的常見問題及解決方法,以及k近鄰算法的Sklearn實(shí)現(xiàn)方法。項(xiàng)目準(zhǔn)備全班學(xué)生以3~5人為一組進(jìn)行分組,各組選出組長,組長組織組員掃碼觀看“k近鄰算法基本原理”視頻,討論并回答下列問題。問題1:k近鄰算法可以解決哪兩類問題?問題2:簡述k近鄰算法解決分類問題的基本原理。問題3:簡述k近鄰算法解決回歸問題的基本原理。問題3:邏輯回歸的基本原理點(diǎn)擊此處播放微課k近鄰算法的基本原理k近鄰算法的Sklearn實(shí)現(xiàn)/項(xiàng)目導(dǎo)航/4.14.24.1k近鄰算法的基本原理
12k近鄰算法(k-NearestNeighbor,kNN)由科弗和哈特提出,是機(jī)器學(xué)習(xí)中最簡單也是應(yīng)用最廣泛的算法之一,它根據(jù)距離函數(shù)計(jì)算待測樣本與所在特征空間中各個(gè)樣本的距離,找到距離待測樣本最近的k個(gè)樣本,依此判定待測樣本屬于某類或用于回歸計(jì)算。4.1k近鄰算法的基本原理4.1.1k近鄰算法的原理分析13k近鄰算法解決分類問題的原理是給定一個(gè)訓(xùn)練數(shù)據(jù)集,對新輸入的樣本,在訓(xùn)練數(shù)據(jù)集中找到與該樣本距離最鄰近的k個(gè)樣本(也就是k個(gè)鄰居),若這k個(gè)樣本中多數(shù)屬于某個(gè)類別,就把該輸入樣本劃分為這個(gè)類別。要尋找與新輸入樣本最鄰近的k個(gè)樣本,需要計(jì)算兩點(diǎn)之間的距離,此時(shí),可使用歐式距離進(jìn)行計(jì)算。假設(shè)兩個(gè)點(diǎn)的坐標(biāo)分別為和,則這兩點(diǎn)之間的歐式距離公式為1.k近鄰算法解決分類問題的原理4.1.1k近鄰算法的原理分析14例如,圖中有兩類不同的樣本數(shù)據(jù)D1和D2,D1用小正方形表示,D2用實(shí)心圓表示,小三角形表示新輸入的未知類別樣本。現(xiàn)在要對新樣本進(jìn)行分類,判斷它屬于D1還是D2。
k近鄰算法解決分類問題k近鄰分類的過程:先主觀設(shè)置k的值,假設(shè)k的值為5,然后通過距離計(jì)算找出與新樣本距離最近的5個(gè)樣本點(diǎn),從圖中可以看出,這5個(gè)近鄰點(diǎn)中有4個(gè)屬于D2類,1個(gè)屬于D1類,從而可判定新樣本屬于D2類。1.k近鄰算法解決分類問題的原理4.1.1k近鄰算法的原理分析15回歸問題研究的是一組變量與另一組變量之間的關(guān)系,其預(yù)測結(jié)果是連續(xù)的數(shù)值。使用k近鄰算法解決回歸問題時(shí),仍然需要計(jì)算待測樣本與所在特征空間中每個(gè)樣本的距離,基于計(jì)算結(jié)果,找到與待測樣本最鄰近的k個(gè)樣本,通過對這k個(gè)樣本的某個(gè)值(如平均值)進(jìn)行統(tǒng)計(jì),依據(jù)各個(gè)待測樣本的統(tǒng)計(jì)值畫出回歸曲線,進(jìn)而預(yù)測新樣本的值。2.k近鄰算法解決回歸問題的原理4.1.1k近鄰算法的原理分析16在研究二手房房價(jià)與面積之間關(guān)系的實(shí)例中,使用k近鄰算法建立模型,得到的回歸曲線如圖所示。
k近鄰算法解決回歸問題使用k近鄰算法建立回歸模型的過程:先主觀設(shè)置k的值,假設(shè)k的值為5,通過計(jì)算找到所在特征空間中與待測樣本距離最近的5個(gè)樣本,然后計(jì)算這5個(gè)樣本的某個(gè)統(tǒng)計(jì)值(如平均值),將這個(gè)值作為待測樣本的預(yù)測值,依據(jù)各個(gè)樣本的預(yù)測值得到回歸曲線。2.k近鄰算法解決回歸問題的原理4.1.2k近鄰算法的常見問題及解決方法17k近鄰算法通常用于光學(xué)字符識(shí)別(opticalcharacterrecognition,OCR)系統(tǒng)、電商平臺(tái)用戶分類、銀行數(shù)據(jù)預(yù)測客戶行為等領(lǐng)域。在實(shí)際應(yīng)用中,k近鄰算法可能會(huì)遇到以下幾個(gè)需要解決的問題。4.1.2k近鄰算法的常見問題及解決方法18k近鄰算法解決分類問題時(shí),經(jīng)常會(huì)遇到這樣的問題:當(dāng)樣本分布不平衡時(shí)(即數(shù)據(jù)集中一個(gè)類的樣本容量很大,而其他類的樣本容量很?。?,很可能會(huì)出現(xiàn)對新樣本的預(yù)測不準(zhǔn)確的情況。因?yàn)闃颖痉植疾痪鶆?,?dāng)輸入一個(gè)新樣本時(shí),該樣本的k個(gè)鄰居中大數(shù)量類的樣本占多數(shù),很可能將新樣本預(yù)測為大數(shù)量的樣本類型,導(dǎo)致預(yù)測誤差。如圖所示,新樣本應(yīng)屬于D1類,但是應(yīng)用k近鄰算法會(huì)將其錯(cuò)誤地劃分為D2類。樣本不平衡時(shí)k近鄰算法的預(yù)測效果對于這類問題,可以采用對近鄰點(diǎn)賦權(quán)值的方法改進(jìn),即與該樣本距離小的鄰居權(quán)值大,與該樣本距離大的鄰居權(quán)值小。由此,將距離遠(yuǎn)近的因素也考慮在內(nèi),避免了因某個(gè)類別樣本的容量過大而導(dǎo)致誤判的情況。1.樣本不平衡對算法的影響4.1.2k近鄰算法的常見問題及解決方法19在k近鄰算法中,k值是主觀設(shè)定的,但人為設(shè)定k值是不科學(xué)的,會(huì)影響模型的性能。一般情況下,k值與預(yù)測誤差率的關(guān)系如圖所示。即隨著k值的增大,誤差率先降低后增高。這很好理解,在一定范圍內(nèi),k值越大,周圍可以借鑒的樣本就越多,預(yù)測誤差率就會(huì)降低;但是當(dāng)k值非常大時(shí),幾乎每個(gè)樣本都變成了待測樣本的鄰居,預(yù)測誤差率肯定就會(huì)增高。例如,訓(xùn)練集中共有30個(gè)樣本,當(dāng)k值增大到30時(shí),k近鄰算法基本上就沒有意義了。要選出最優(yōu)的k值,需要分別嘗試不同k值下的預(yù)測效果。在Sklearn中,可使用交叉驗(yàn)證法或網(wǎng)格搜索法確定k的取值。
k值與預(yù)測誤差率的關(guān)系2.k的取值對算法的影響4.1.2k近鄰算法的常見問題及解決方法20世界放射學(xué)界一年一度的盛會(huì)——北美放射學(xué)會(huì)年會(huì)于2022年11月27日—12月1日在美國芝加哥舉行,“AI+醫(yī)療”的創(chuàng)新研究與應(yīng)用再度成為大會(huì)焦點(diǎn)。作為唯一一家參展的中國醫(yī)療人工智能企業(yè),數(shù)坤(北京)網(wǎng)絡(luò)科技股份有限公司向世界展示了中國原創(chuàng)、世界引領(lǐng)的科技創(chuàng)新成果,用中國人工智能為全球醫(yī)療健康行業(yè)的高質(zhì)量發(fā)展注入新動(dòng)力。數(shù)坤(北京)網(wǎng)絡(luò)科技股份有限公司本次參展的“數(shù)字醫(yī)生”由30多種產(chǎn)品構(gòu)成,覆蓋心、腦、胸、腹等人體多個(gè)關(guān)鍵部位,支持心腦血管、腫瘤和慢性病等重大疾病的篩查、輔助診斷及治療決策全流程,以完整的產(chǎn)品架構(gòu)和全面的應(yīng)用布局驚艷全場。讓全世界深深記住了中國人工智能的價(jià)值與魅力。素養(yǎng)之窗1.說一說k近鄰算法的原理分析?2.k近鄰算法的常見問題及解決方法是?課堂訓(xùn)練k近鄰算法的原理分析k近鄰算法的常見問題及解決方法課堂小結(jié)4.2k近鄰算法的Sklearn實(shí)現(xiàn)4.2.1Sklearn中的k近鄰模塊24Sklearn的neighbors模塊提供了KNeighborsClassifier和KNeighborsRegressor類,分別用于實(shí)現(xiàn)k近鄰分類和回歸算法。在Sklearn中,可通過下面語句導(dǎo)入k近鄰算法模塊。fromsklearn.neighborsimportKNeighborsClassifier #導(dǎo)入k近鄰分類模塊fromsklearn.neighborsimportKNeighborsRegressor #導(dǎo)入k近鄰回歸模塊4.2.1Sklearn中的k近鄰模塊25KNeighborsClassifier和KNeighborsRegressor類都有如下幾個(gè)參數(shù)。(1)參數(shù)n_neighbors用來指定k近鄰算法中的k值,該參數(shù)必須指定。(2)參數(shù)weights用于指定權(quán)重,其取值有uniform、distance與自定義函數(shù)3種:①
uniform表示不管近鄰點(diǎn)遠(yuǎn)近,權(quán)重值都一樣,這是最普通的k近鄰算法;②distance表示權(quán)重和距離成反比,即距離預(yù)測目標(biāo)越近權(quán)重值越大;③自定義函數(shù)表示用戶可以自定義一個(gè)函數(shù),根據(jù)輸入的坐標(biāo)值返回對應(yīng)的權(quán)重值。(3)參數(shù)algorithm用來設(shè)置k近鄰模型使用的算法,其取值有brute、kd_tree、ball_tree與auto:①
brute表示直接計(jì)算所有距離再排序;②kd_tree表示使用kd樹實(shí)現(xiàn)k近鄰算法;③ball_tree表示使用球樹實(shí)現(xiàn)k近鄰算法;④
auto為默認(rèn)參數(shù),表示自動(dòng)選擇合適的方法構(gòu)建模型。kd樹算法點(diǎn)擊此處播放微課4.2.2k近鄰算法的應(yīng)用舉例26表4-2話劇社團(tuán)比賽成績數(shù)據(jù)集參賽學(xué)生y參賽學(xué)生y1193008626512304009737013394701075821440520117785154750012909516505501392901760601
【例4-1】某學(xué)校話劇社團(tuán)要招收新人,發(fā)出招新通知后,報(bào)名的學(xué)生非常多。于是,話劇社團(tuán)決定組織一場個(gè)人比賽,比賽分為兩個(gè)項(xiàng)目——表演和臺(tái)詞。表演項(xiàng)目得分用表示,臺(tái)詞項(xiàng)目得分用表示,最終成績?nèi)绫?-2所示(表中y的取值,1表示能進(jìn)入話劇社團(tuán),0表示不能進(jìn)入話劇社團(tuán))。使用k近鄰算法建立模型,判斷最后一個(gè)學(xué)生(,)是否能夠進(jìn)入該話劇社團(tuán)。27(1)這是一個(gè)二分類問題,有兩個(gè)特征變量,使用k近鄰算法建立模型,需要先確定最優(yōu)的k值。在Sklearn中,可以使用交叉驗(yàn)證法得到最佳的k值。4.2.2k近鄰算法的應(yīng)用舉例【程序分析】28【運(yùn)行結(jié)果】
k值與預(yù)測誤差率的關(guān)系4.2.2k近鄰算法的應(yīng)用舉例程序運(yùn)行結(jié)果如圖所示??梢姡琸的取值為5或7時(shí),模型的預(yù)測誤差率最低。下面將選擇這兩個(gè)值作為k值,訓(xùn)練模型?!緟⒖即a】#導(dǎo)入需要的模塊importmatplotlib.pyplotaspltimportnumpyasnpfromsklearn.neighborsimportKNeighborsClassifierfromsklearn.model_selectionimporttrain_test_splitfromsklearn.model_selectionimportcross_val_score
#導(dǎo)入交叉驗(yàn)證模塊#數(shù)據(jù)處理x=np.array([[19,30],[30,40],[39,47],[40,52],[47,50],[50,55],[60,60],[62,65],[73,70],[75,82],[77,85],[90,95],[92,90]])y=np.array([0,0,0,0,0,0,1,1,1,1,1,1,1])x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=0)#k取不同值的情況下,模型的預(yù)測誤差率計(jì)算k_range=range(2,11) #設(shè)置k值的取值范圍k_error=[] #保存預(yù)測誤差率的數(shù)組forkink_range:model=KNeighborsClassifier(n_neighbors=k)scores=cross_val_score(model,x,y,cv=5,scoring='accuracy') #交叉驗(yàn)證中,cv參數(shù)決定數(shù)據(jù)集劃分比例,這里的訓(xùn)練集與測試集的比例是5:1k_error.append(1-scores.mean())#畫圖,x軸表示k的取值,y軸表示預(yù)測誤差率plt.rcParams['font.sans-serif']='Simhei'plt.plot(k_range,k_error,'r-')plt.xlabel('k的取值')plt.ylabel('預(yù)測誤差率')plt.show()29【運(yùn)行結(jié)果】
4.2.2k近鄰算法的應(yīng)用舉例程序運(yùn)行結(jié)果如圖所示。可見,與時(shí),兩個(gè)模型的分類結(jié)果都是0,即最后一位學(xué)生(,)不能進(jìn)入該話劇社團(tuán)。新樣本分類結(jié)果(2)當(dāng)k值為5或7時(shí),使用k近鄰算法分別訓(xùn)練模型,并對新樣本進(jìn)行預(yù)測。【參考代碼】#k=5與k=7時(shí),分別訓(xùn)練模型model1=KNeighborsClassifier(5) #k=5時(shí),建立模型model1.fit(x_train,y_train)model2=KNeighborsClassifier(7) #k=7時(shí),建立模型model2.fit(x_train,y_train)#分別使用兩個(gè)模型預(yù)測新樣本pred1=model1.predict([[55,65]])pred2=model2.predict([[55,65]])print("k=5時(shí),預(yù)測樣本的分類結(jié)果為",pred1)print("k=7時(shí),預(yù)測樣本的分類結(jié)果為",pred2)4.2.2k近鄰算法的應(yīng)用舉例30【例4-2】表4-3是某班級(jí)學(xué)生身高和體重的數(shù)據(jù)集,表中最后一名學(xué)生只有身高信息,體重信息丟失。要求使用k近鄰算法建立模型,預(yù)測最后一名學(xué)生(身高:173cm)的體重。(本實(shí)例只用于學(xué)習(xí),不代表實(shí)際值)表4-3學(xué)生身高與體重?cái)?shù)據(jù)集學(xué)生身高/(cm)體重/(kg)學(xué)生身高/(cm)體重/(kg)11821137158722178105815445317086914949416883101444351658611173?616274
31(1)題目要求預(yù)測身高為173cm學(xué)生的體重,這是一個(gè)回歸問題,使用k近鄰算法建立模型,需要先確定最優(yōu)的k值。在Sklearn中,可以測試不同k值下,模型的預(yù)測準(zhǔn)確率,從而找到最優(yōu)的k值。4.2.2k近鄰算法的應(yīng)用舉例【程序分析】32【運(yùn)行結(jié)果】
4.2.2k近鄰算法的應(yīng)用舉例程序運(yùn)行結(jié)果如圖所示??梢?,k的取值為3時(shí),模型的預(yù)測誤差率最低。下面將選擇這個(gè)值作為k值,訓(xùn)練模型。k值與預(yù)測誤差率的關(guān)系【參考代碼】#導(dǎo)入需要的模塊importmatplotlib.pyplotaspltimportnumpyasnpfromsklearn.neighborsimportKNeighborsRegressorfromsklearn.model_selectionimporttrain_test_split#數(shù)據(jù)處理x=np.array([[182],[178],[170],[168],[165],[162],[158],[154],[149],[144]])y=np.array([[113],[105],[86],[83],[86],[74],[72],[45],[49],[43]])x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=0)#k取不同值的情況下,模型的預(yù)測誤差率計(jì)算k_range=range(2,8) #設(shè)置k值的取值范圍k_error=[] #保存預(yù)測誤差率的數(shù)組forkink_range:model=KNeighborsRegressor(n_neighbors=k)model.fit(x_train,y_train)scores=model.score(x_test,y_test)k_error.append(1-scores)#畫圖,x軸表示k的取值,y軸表示預(yù)測誤差率plt.rcParams['font.sans-serif']='Simhei'plt.plot(k_range,k_error,'r-')plt.xlabel('k的取值')plt.ylabel('預(yù)測誤差率')plt.show()33【運(yùn)行結(jié)果】
4.2.2k近鄰算法的應(yīng)用舉例程序運(yùn)行結(jié)果如圖所示?;貧w曲線(2)當(dāng)k值為3時(shí),使用k近鄰算法訓(xùn)練模型,并畫出回歸曲線圖?!緟⒖即a】#建立模型,訓(xùn)練模型model=KNeighborsRegressor(3) #建立模型model.fit(x_train,y_train) #訓(xùn)練模型#設(shè)置坐標(biāo)軸plt.xlabel('身高/cm') #圖形橫軸的標(biāo)簽名稱plt.ylabel('體重/kg') #圖形縱軸的標(biāo)簽名稱plt.rcParams['font.sans-serif']='Simhei' #中文文字設(shè)置為黑體plt.axis([140,190,40,140])#設(shè)置圖像橫軸與縱軸的最大值與最小值#繪制并顯示圖形plt.scatter(x,y,s=60,c='k',marker='o') #繪制散點(diǎn)圖plt.plot(x,model.predict(x),'r-') #繪制曲線plt.show()34【參考代碼】4.2.2k近鄰算法的應(yīng)用舉例(3)對新樣本進(jìn)行預(yù)測。pred=model.predict([[173]])print("身高173cm的學(xué)生體重預(yù)測為",pred)程序運(yùn)行結(jié)果如圖所示。即最后一名學(xué)生的體重約為100kg?;貧w模型預(yù)測結(jié)果【運(yùn)行結(jié)果】
項(xiàng)目實(shí)施——k近鄰算法實(shí)現(xiàn)葡萄酒的分類步驟1新建兩個(gè)JupyterNotebook文檔,分別命名為“item4-ss1-y.ipynb”和“item4-ss2-y.ipynb”,“item4-ss1-y.ipynb”用來做數(shù)據(jù)預(yù)處理,“item4-ss2-y.ipynb”用來訓(xùn)練模型。步驟2在“item4-ss1-y.ipynb”文檔中編寫數(shù)據(jù)預(yù)處理程序。35數(shù)據(jù)準(zhǔn)備點(diǎn)擊此處播放微課1.?dāng)?shù)據(jù)準(zhǔn)備開始編寫程序前,須將下載完成的葡萄酒數(shù)據(jù)集文件或本書提供的配套素材“item4/wine.data”復(fù)制到當(dāng)前工作目錄中,也可將數(shù)據(jù)文件放于其他盤,如果放于其他盤,使用Pandas讀取數(shù)據(jù)文件時(shí)要指定路徑。36項(xiàng)目實(shí)施——k近鄰算法實(shí)現(xiàn)葡萄酒的分類指點(diǎn)迷津37項(xiàng)目實(shí)施——k近鄰算法實(shí)現(xiàn)葡萄酒的分類步驟3導(dǎo)入Pandas庫。步驟4讀取葡萄酒數(shù)據(jù)并為數(shù)據(jù)集指定列名稱為label、a1、a2、a3、a4、a5、a6、a7、a8、a9、a10、a11、a12和a13。步驟5輸出葡萄酒數(shù)據(jù)集。步驟6提取數(shù)據(jù)集的特征變量與標(biāo)簽,分別存儲(chǔ)在data與target中。1.?dāng)?shù)據(jù)準(zhǔn)備iloc全稱indexlocation,它可以對數(shù)據(jù)進(jìn)行位置索引,從而在數(shù)據(jù)表中提取出相應(yīng)的數(shù)據(jù)。38項(xiàng)目實(shí)施——k近鄰算法實(shí)現(xiàn)葡萄酒的分類指點(diǎn)迷津39項(xiàng)目實(shí)施——k近鄰算法實(shí)現(xiàn)葡萄酒的分類葡萄酒數(shù)據(jù)集【運(yùn)行結(jié)果】
程序運(yùn)行結(jié)果如圖所示??梢?,葡萄酒數(shù)據(jù)集導(dǎo)入成功。1.?dāng)?shù)據(jù)準(zhǔn)備【參考代碼】importpandasaspd#讀取數(shù)據(jù)并進(jìn)行輸出names=['label','a1','a2','a3','a4','a5','a6','a7','a8','a9','a10','a11','a12','a13']dataset=pd.read_csv("wine.data",names=names)print("葡萄酒數(shù)據(jù)集如下:")print(dataset)#分別提取數(shù)據(jù)集的特征變量與標(biāo)簽data=dataset.iloc[range(0,178),range(1,14)] #特征變量target=dataset.iloc[range(0,178),range(0,1)] #標(biāo)簽項(xiàng)目實(shí)施——k近鄰算法實(shí)現(xiàn)葡萄酒的分類40步驟1導(dǎo)入Matplotlib庫,為畫箱形圖做準(zhǔn)備。步驟2使用plot()函數(shù)畫出箱形圖,檢查數(shù)據(jù)集的每個(gè)特征中是否存在異常值。點(diǎn)擊此處播放微課數(shù)據(jù)清洗2.?dāng)?shù)據(jù)清洗項(xiàng)目實(shí)施——k近鄰算法實(shí)現(xiàn)葡萄酒的分類41在機(jī)器學(xué)習(xí)中,檢查異常值通常使用箱形圖。箱形圖又稱盒式圖或箱線圖,能夠真實(shí)、直觀地呈現(xiàn)數(shù)據(jù)的分布情況,并且對數(shù)據(jù)沒有任何限制。箱形圖通過上限和下限作為數(shù)據(jù)分布的邊界,任何高于上限或低于下限的數(shù)據(jù)都可以認(rèn)為是異常值,如圖所示。箱形圖高手點(diǎn)撥使用plot()函數(shù)畫箱形圖時(shí),可以設(shè)置如下參數(shù):(1)參數(shù)kind表示選擇繪制圖形的類別,選擇“box”表示繪制箱形圖。(2)參數(shù)subplots用于設(shè)置是否對每列分別作子圖。(3)layout表示圖形的布局,如layout=(4,4)表示圖形布局為4行4列。42項(xiàng)目實(shí)施——k近鄰算法實(shí)現(xiàn)葡萄酒的分類指點(diǎn)迷津43項(xiàng)目實(shí)施——k近鄰算法實(shí)現(xiàn)葡萄酒的分類【運(yùn)行結(jié)果】
程序運(yùn)行結(jié)果如圖a和圖b所示。從圖a的箱形圖中可以看到,特征變量a2、a3、a4、a5、a9、a10與a11都存在異常數(shù)據(jù);圖b顯示了這些異常數(shù)據(jù)的具體情況。步驟3查找數(shù)據(jù)集中的異常數(shù)據(jù),并將異常數(shù)據(jù)顯示出來。圖a
葡萄酒數(shù)據(jù)各特征變量的箱形圖圖b
葡萄酒數(shù)據(jù)集的異常數(shù)據(jù)2.?dāng)?shù)據(jù)清洗【參考代碼】importmatplotlib.pyplotasplt#畫箱形圖plt.style.use('seaborn-darkgrid')plt.rcParams['axes.unicode_minus']=False #正常顯示負(fù)號(hào)data.plot(kind='box',subplots=True,layout=(3,5),sharex=False,sharey=False)#查找異常數(shù)據(jù)并輸出p=data.boxplot(return_type='dict') #返回字典類型數(shù)據(jù)foriinrange(13):y=p['fliers'][i].get_ydata() #查找異常數(shù)據(jù)print('a',i+1,'中異常值:',y) #輸出異常數(shù)據(jù)plt.show()步驟5將替換完成的數(shù)據(jù)集文件另存為“wine-clean.data”。44項(xiàng)目實(shí)施——k近鄰算法實(shí)現(xiàn)葡萄酒的分類表4-4葡萄酒數(shù)據(jù)集異常值與修正值對比標(biāo)簽異常值修正值標(biāo)簽異常值修正值a25.84.37a31.362.45.514.163.222.615.653.213.232.58a410.616.4a5151.0106.530.023.44139.09428.523.25136.0106.528.523162.0116a93.282.41a1010.87.853.581.85513.07.74a111.710.9411.757.710.688.44步驟4在數(shù)據(jù)集中,對顯示出來的異常值進(jìn)行處理。依據(jù)異常樣本數(shù)據(jù)的前后值,人為近似估計(jì)替換異常值,如a2中的異常值5.8前后的數(shù)據(jù)分別為4.43和4.31,故將此異常值替換為4.37(近鄰數(shù)據(jù)的平均值)。替換完成的異常值與修正值如表4-4所示。2.?dāng)?shù)據(jù)清洗項(xiàng)目實(shí)施——k近鄰算法實(shí)現(xiàn)葡萄酒的分類45對異常值進(jìn)行處理時(shí),處理的方法與業(yè)務(wù)有直接的關(guān)系,如果去掉異常數(shù)據(jù)對模型的影響不大,則可去掉異常值。否則,需要依據(jù)一定的算法(如近鄰數(shù)據(jù)的平均值、專家的印象值等)對異常數(shù)據(jù)進(jìn)行修改。高手點(diǎn)撥項(xiàng)目實(shí)施——k近鄰算法實(shí)現(xiàn)葡萄酒的分類46步驟1在“item4-ss2-y.ipynb”文檔中編寫訓(xùn)練模型程序。步驟2使用Pandas讀取修正后的數(shù)據(jù)。步驟3提取數(shù)據(jù)集的特征變量與標(biāo)簽,分別存儲(chǔ)在data與target中。步驟4導(dǎo)入preprocessing模塊,使用z-score方法進(jìn)行數(shù)據(jù)標(biāo)準(zhǔn)化處理,將處理后的數(shù)據(jù)存儲(chǔ)在cdata中,并輸出cdata的值。點(diǎn)擊此處播放微課數(shù)據(jù)標(biāo)準(zhǔn)化處理3.?dāng)?shù)據(jù)標(biāo)準(zhǔn)化處理47項(xiàng)目實(shí)施——k近鄰算法實(shí)現(xiàn)葡萄酒的分類【運(yùn)行結(jié)果】
程序運(yùn)行結(jié)果如圖所示。數(shù)據(jù)標(biāo)準(zhǔn)化處理后的結(jié)果3.?dāng)?shù)據(jù)標(biāo)準(zhǔn)化處理【參考代碼】importpandasaspdfromsklearnimportpreprocessing#導(dǎo)入數(shù)據(jù),分別提取數(shù)據(jù)集的特征變量與標(biāo)簽names=['label','a1','a2','a3','a4','a5','a6','a7','a8','a9','a10','a11','a12','a13']dataset=pd.read_csv("wine-clean.data",names=names)data=dataset.iloc[range(0,178),range(1,14)]target=dataset.iloc[range(0,178),range(0,1)].values.reshape(1,178)[0]#使用z-score方法進(jìn)行數(shù)據(jù)標(biāo)準(zhǔn)化處理cdata=preprocessing.StandardScaler().fit_transform(data)print(cdata)項(xiàng)目實(shí)施——k近鄰算法實(shí)現(xiàn)葡萄酒的分類48步驟1導(dǎo)入需要的庫。步驟2將特征變量與標(biāo)簽分別賦值給x和y,并將數(shù)據(jù)集拆分為訓(xùn)練集與測試集。步驟3測試k取不同值的情況下,模型的預(yù)測誤差率。步驟4繪制圖像,顯示k取不同值時(shí),預(yù)測誤差率的變化曲線圖。點(diǎn)擊此處播放微課k值的選擇4.k值的選擇49項(xiàng)目實(shí)施——k近鄰算法實(shí)現(xiàn)葡萄酒的分類【運(yùn)行結(jié)果】
程序運(yùn)行結(jié)果如圖所示。可見,k值選擇9、11與13時(shí),模型的預(yù)測誤差率較低。因此,本次訓(xùn)練模型選擇k值為9。
k值與預(yù)測誤差率的關(guān)系(葡萄酒數(shù)據(jù)集)4.k值的選擇【參考代碼】#導(dǎo)入需要的庫importmatplotlib.pyplotaspltfromsklearn.neighborsimportKNeighborsClassifierfromsklearn.model_selectionimporttrain_test_splitfromsklearn.model_selectionimportcross_val_score #導(dǎo)入交叉驗(yàn)證模塊#將特征變量與標(biāo)簽分別賦值給x和y,并將數(shù)據(jù)集拆分為訓(xùn)練集與測試集x,y=cdata,targetx_train,x_test,y_train,y_test=train_test_split(x,y,random_state=0)#k取不同值的情況下,模型的預(yù)測誤差率計(jì)算k_range=range(1,15) #設(shè)置k值的取值范圍k_error=[] #保存預(yù)測誤差率的數(shù)組forkink_range:model=KNeighborsClassifier(n_neighbors=k)scores=cross_val_score(model,x,y,cv=5,scoring='accuracy')
#5折交叉驗(yàn)證k_error.append(1-scores.mean())#畫圖,x軸表示k的取值,y軸表示預(yù)測誤差率plt.rcParams['font.sans-serif']='Simhei'plt.plot(k_range,k_error,'r-')plt.xlabel('k的取值')plt.ylabel('預(yù)測誤差率')plt.show()項(xiàng)目實(shí)施——k近鄰算法實(shí)現(xiàn)葡萄酒的分類50步驟1導(dǎo)入模型預(yù)測準(zhǔn)確率評(píng)估模塊。步驟2定義k近鄰模型,k取值為9。步驟3使用accuracy_score()函數(shù)對模型進(jìn)行評(píng)估,輸出模型的預(yù)測準(zhǔn)確率。步驟4輸出測試集的預(yù)測標(biāo)簽值與真實(shí)標(biāo)簽值,將兩者進(jìn)行對比,驗(yàn)證預(yù)測準(zhǔn)確率的計(jì)算結(jié)果。點(diǎn)擊此處播放微課訓(xùn)練與評(píng)估模型5.訓(xùn)練與評(píng)估模型51項(xiàng)目實(shí)施——k近鄰算法實(shí)現(xiàn)葡萄酒的分類【運(yùn)行結(jié)果】
程序運(yùn)行結(jié)果如圖所示??梢姡灸P驮跍y試集上有兩個(gè)樣本預(yù)測錯(cuò)誤,預(yù)測準(zhǔn)確率為,與程序輸出結(jié)果基本吻合。
模型預(yù)測準(zhǔn)確率結(jié)果5.訓(xùn)練與評(píng)估模型【參考代碼】fromsklearn.metricsimportaccuracy_score#k=9時(shí),訓(xùn)練模型model=KNeighborsClassifier(n_neighbors=9)model.f
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小學(xué)課外活動(dòng)管理系統(tǒng):設(shè)計(jì)、實(shí)現(xiàn)與應(yīng)用探索
- 主播打賞提現(xiàn)手續(xù)費(fèi)管理規(guī)范
- 第07講:第三章 一元函數(shù)的導(dǎo)數(shù)及其應(yīng)用(測)(基礎(chǔ)卷)(解析版)
- 小學(xué)數(shù)學(xué)綜合與實(shí)踐活動(dòng)教學(xué):現(xiàn)狀洞察與策略革新
- 小學(xué)低年級(jí)圖畫書選擇的教育洞察:師生視角與策略研究
- 小型堆氫風(fēng)險(xiǎn)解析與防控技術(shù)的深度探究
- 住宅包裹寄存合同
- 自動(dòng)化生產(chǎn)線建設(shè)合同協(xié)議
- 2026年文化傳媒合規(guī)審計(jì)服務(wù)合同
- 2026年稅務(wù)籌劃合作協(xié)議
- 燃?xì)獍踩[患知識(shí)培訓(xùn)課件
- 手術(shù)室護(hù)理核心要點(diǎn)
- 醫(yī)?;鸨O(jiān)管條例課件
- 九寨溝講解課件
- 2025年兵器裝備集團(tuán)招聘考試面試經(jīng)驗(yàn)與心得總結(jié)
- 糖尿病護(hù)理培訓(xùn)課件
- 金礦詳查實(shí)施方案實(shí)施方案
- 晚期肝癌患者護(hù)理
- 2023年水土保持方案收費(fèi)標(biāo)準(zhǔn)依據(jù)
- 汽貿(mào)合伙協(xié)議書范本
- 四川省德陽市高中2024-2025學(xué)年高一上學(xué)期期末教學(xué)質(zhì)量監(jiān)測考試英語試題(PDF版無答案)
評(píng)論
0/150
提交評(píng)論