《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)案例》教學(xué)課件-04保險(xiǎn)風(fēng)險(xiǎn)預(yù)測(cè)_第1頁(yè)
《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)案例》教學(xué)課件-04保險(xiǎn)風(fēng)險(xiǎn)預(yù)測(cè)_第2頁(yè)
《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)案例》教學(xué)課件-04保險(xiǎn)風(fēng)險(xiǎn)預(yù)測(cè)_第3頁(yè)
《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)案例》教學(xué)課件-04保險(xiǎn)風(fēng)險(xiǎn)預(yù)測(cè)_第4頁(yè)
《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)案例》教學(xué)課件-04保險(xiǎn)風(fēng)險(xiǎn)預(yù)測(cè)_第5頁(yè)
已閱讀5頁(yè),還剩38頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

機(jī)器學(xué)習(xí)實(shí)戰(zhàn)案例

——保險(xiǎn)風(fēng)險(xiǎn)預(yù)測(cè)業(yè)務(wù)背景分析

英國(guó)保誠(chéng)公司是英國(guó)最大的人壽保險(xiǎn)公司之一,其業(yè)務(wù)包括人壽保險(xiǎn)、投資管理等,服務(wù)網(wǎng)絡(luò)遍布全世界。保誠(chéng)公司擁有眾多的員工以及龐大的客戶群體。在人壽保險(xiǎn)方面,保誠(chéng)公司擁有大量的用戶數(shù)據(jù),這些數(shù)據(jù)不僅包含了投保人的個(gè)人健康、工作經(jīng)歷等基本信息,還包含了可能與投保人的投保風(fēng)險(xiǎn)密切相關(guān)的保險(xiǎn)歷史、家族史、病歷等信息。保誠(chéng)公司希望通過(guò)使用這些有潛在價(jià)值的數(shù)據(jù),來(lái)準(zhǔn)確地預(yù)測(cè)投保人的投保風(fēng)險(xiǎn),從而為公司降低投保風(fēng)險(xiǎn)。本案例的目的是利用脫敏處理后的投保人數(shù)據(jù)集,使用分類算法,訓(xùn)練得到高效準(zhǔn)確的風(fēng)險(xiǎn)分類模型,并使用此模型對(duì)投保人的投保風(fēng)險(xiǎn)進(jìn)行預(yù)測(cè)。在案例的設(shè)計(jì)上,構(gòu)建了多種類型的機(jī)器學(xué)習(xí)模型,并使用保誠(chéng)公司的用戶數(shù)據(jù)對(duì)模型進(jìn)行訓(xùn)練,最后對(duì)訓(xùn)練得到的模型進(jìn)行評(píng)估,選擇表現(xiàn)最佳的模型作為風(fēng)險(xiǎn)預(yù)測(cè)的解決方案。數(shù)據(jù)概況

本案例使用的數(shù)據(jù)集是保誠(chéng)公司的用戶數(shù)據(jù)經(jīng)過(guò)脫敏處理后得到的投保人數(shù)據(jù)集,分為訓(xùn)練集(train.csv)和預(yù)測(cè)集(predict.csv)兩部分。訓(xùn)練集和預(yù)測(cè)集唯一的不同之處是訓(xùn)練集中包含預(yù)測(cè)集中沒(méi)有的Response字段。Response字段表示的是一個(gè)與最終決策相關(guān)的風(fēng)險(xiǎn)序號(hào)變量,即train.csv數(shù)據(jù)集的標(biāo)簽。需要依據(jù)其他特征列的數(shù)據(jù)特征,準(zhǔn)確地找到標(biāo)簽Response的分類規(guī)律。訓(xùn)練集包含59381條數(shù)據(jù),每條數(shù)據(jù)包含118個(gè)屬性,部分屬性的說(shuō)明如表所示。除Id、Medical_Keyword_1-48和Response變量以外,其他的變量都經(jīng)過(guò)歸一化處理。目標(biāo)變量Response是一個(gè)具有8個(gè)級(jí)別的有序風(fēng)險(xiǎn)度量,因而設(shè)計(jì)的模型應(yīng)當(dāng)是一個(gè)多分類模型。變量描述Id與產(chǎn)品投保人相關(guān)聯(lián)的唯一標(biāo)識(shí)符Product_Info_1-7一組與產(chǎn)品相關(guān)聯(lián)的變量(分類變量)Ins_Age投保人年齡(連續(xù)變量)Ht投保人身高(連續(xù)變量)Wt投保人體重(連續(xù)變量)BMI投保人身體健康指數(shù)(歸一化的連續(xù)變量)Employment_Info_1-6一組與投保人的工作經(jīng)歷有關(guān)的變量(分類變量)InsuredInfo_1-6一組提供投保人信息的變量(分類變量)Insurance_History_1-9一組與投保人的保險(xiǎn)歷史有關(guān)的變量(分類變量)Family_Hist_1-5一組與投保人家族史有關(guān)的變量(連續(xù)變量)Medical_History_1-41一組與投保人病歷有關(guān)的變量(分類變量)Medical_Keyword_1-48一組是否存在與投保人相關(guān)的醫(yī)療關(guān)鍵詞相關(guān)的虛擬變量(離散變量)Response目標(biāo)變量,一個(gè)與最終決策相關(guān)的風(fēng)險(xiǎn)序號(hào)變量環(huán)境準(zhǔn)備

本案例主要涉及編程語(yǔ)言、IDE和框架三個(gè)方面,其中編程語(yǔ)言選用Python,IDE選用Pycharm(建議初學(xué)者使用Pycharm或者Anaconda),框架使用TensorFlow。在各大數(shù)據(jù)分析流行語(yǔ)言中,Python由于其豐富的科學(xué)計(jì)算包以及簡(jiǎn)潔高效的編程風(fēng)格受到越來(lái)越多從事機(jī)器學(xué)習(xí)領(lǐng)域的用戶的青睞。本案例采用的Python版本為3.6.5。IDE采用Pycharm,Pycharm是一款非常流行的PythonIDE,具有強(qiáng)大的調(diào)試、測(cè)試功能,還能夠非常便捷地導(dǎo)入豐富的API包。本案例中,各種算法模型使用開(kāi)源的TensorFlow框架實(shí)現(xiàn)。TensorFlow框架是當(dāng)前使用最為廣泛的深度學(xué)習(xí)框架,其強(qiáng)大的功能深受眾人喜愛(ài)。本案例使用TensorFlow1.8。目前TensorFlow已在GitHub上開(kāi)源。其他一些后續(xù)需要用到的包(例如Pandas、NumPy等)也可以從Pycharm中便捷地導(dǎo)入。環(huán)境準(zhǔn)備

TensorFlow是一個(gè)采用數(shù)據(jù)流圖(DataFlowGraph)、用于數(shù)值計(jì)算的開(kāi)源軟件庫(kù),其有一個(gè)含有2個(gè)隱層的前饋神經(jīng)網(wǎng)絡(luò)對(duì)應(yīng)的數(shù)據(jù)流圖,如圖所示。節(jié)點(diǎn)(Nodes)表示數(shù)學(xué)操作或者狀態(tài),邊(Edges)則表示在節(jié)點(diǎn)間相互聯(lián)系的多維數(shù)據(jù)數(shù)組,即張量(Tensor)。它靈活的架構(gòu)可以在多種平臺(tái)上展開(kāi)計(jì)算。TensorFlow最初由谷歌大腦小組(隸屬于谷歌機(jī)器智能研究機(jī)構(gòu))的研究員和工程師開(kāi)發(fā)出來(lái),用于機(jī)器學(xué)習(xí)和深度神經(jīng)網(wǎng)絡(luò)方面的研究,但這個(gè)系統(tǒng)的通用性使其也可廣泛地應(yīng)用于其他領(lǐng)域。數(shù)據(jù)流圖用節(jié)點(diǎn)和邊的有向圖來(lái)描述數(shù)值計(jì)算。節(jié)點(diǎn)一般用來(lái)表示施加的數(shù)學(xué)操作,但也可以表示數(shù)據(jù)輸入(FeedIn)的起點(diǎn)/輸出(PushOut)的終點(diǎn),或者是讀取/寫入持久變量(PersistentVariable)的終點(diǎn)。邊表示節(jié)點(diǎn)之間的輸入/輸出關(guān)系。一旦輸入端的所有張量準(zhǔn)備好,節(jié)點(diǎn)將被分配到各種計(jì)算設(shè)備完成異步并行地執(zhí)行運(yùn)算。數(shù)據(jù)預(yù)處理

數(shù)據(jù)預(yù)處理是對(duì)原始數(shù)據(jù)進(jìn)行必要的清理、集成、轉(zhuǎn)換、離散和規(guī)約等一系列的處理工作。了解數(shù)據(jù)預(yù)處理之前,首先需要了解原始數(shù)據(jù)的數(shù)據(jù)特征。一般來(lái)講,原始數(shù)據(jù)包含不完整性、噪聲、雜亂性等特征。顧名思義,不完整性就是數(shù)據(jù)缺失;噪聲表示數(shù)據(jù)具有不正確的屬性值,即包含錯(cuò)誤或存在偏離期望的離群值;雜亂性表示數(shù)據(jù)缺乏統(tǒng)一的定義標(biāo)準(zhǔn)。數(shù)據(jù)預(yù)處理并沒(méi)有一個(gè)標(biāo)準(zhǔn)的處理流程,需要結(jié)合數(shù)據(jù)集的數(shù)據(jù)特征,根據(jù)經(jīng)驗(yàn)選擇處理方法。就本案例所使用的數(shù)據(jù)集而言,此數(shù)據(jù)集已進(jìn)行了歸一化處理,因而不再對(duì)數(shù)據(jù)進(jìn)行規(guī)約處理。在進(jìn)行數(shù)據(jù)預(yù)處理之前,需要導(dǎo)入進(jìn)行數(shù)據(jù)預(yù)處理所使用的工具包。在本案例中,使用導(dǎo)入Pandas工具包進(jìn)行數(shù)據(jù)預(yù)處理,示例代碼如下。importpandasaspd數(shù)據(jù)預(yù)處理——數(shù)據(jù)加載與預(yù)覽

數(shù)據(jù)集的格式為CSV文件,使用Pandas中的read_csv方法讀取數(shù)據(jù)集,得到的train_data為DataFrame格式,示例代碼如下。train_data=pd.read_csv('D:\\DataSet\\Prudential_Life_Insurance_Assessmen''\\train\\train.csv')

Pandas中擁有許多查看數(shù)據(jù)摘要的方法,可以調(diào)用一些方法來(lái)對(duì)數(shù)據(jù)進(jìn)行預(yù)覽,示例代碼如下,代碼輸出如右圖所示。由于train_data.describe部分由于字段比較多,這里只展示了前四個(gè)字段的摘要信息。print(train_data.columns)print(train_())print(train_data.shape)print(train_data.describe())數(shù)據(jù)預(yù)處理——缺失值處理(1)

找到字段缺失值(空值)的大體分布狀況,然后再進(jìn)行缺失值處理。輸出每個(gè)字段缺失值的總數(shù)以及占據(jù)字段取值的百分比,并用降序排序,示例代碼如下,輸出結(jié)果如下圖。total=train_data.isnull().sum().sort_values(ascending=False)percent=(train_data.isnull().sum()/train_data.isnull().count()).sort_values(ascending=False)Missing_Value=pd.concat([total,percent],axis=1,keys=['Total','Percent'])print(Missing_Value)數(shù)據(jù)預(yù)處理——缺失值處理(2)

可以看到,在缺失值較多的字段,其缺失比例非常高,甚至高達(dá)90%。對(duì)于此類數(shù)據(jù)字段,如果使用填充的方式對(duì)缺失值進(jìn)行填充,需要很多的計(jì)算量,并且可能會(huì)影響模型的質(zhì)量。對(duì)于那些缺失值較少的字段,可以采用填充值或刪除行等多種方法進(jìn)行處理。對(duì)于數(shù)值型變量,可以使用平均值或中位數(shù)等對(duì)缺失值進(jìn)行填充,刪除行是刪除缺失值所在的整行記錄。對(duì)于非數(shù)值型變量,可以用字段頻率最大的取值填充空值。當(dāng)缺失值相對(duì)于總體樣本很少時(shí),可以采用刪除行的策略。這里使用平均值對(duì)Employment_Info_6、Medical_History_1、Employment_Info_4等字段的缺失值進(jìn)行填充處理,并對(duì)Employment_Info_1字段的缺失值進(jìn)行刪除行處理,示例代碼如下。#缺失值處理train_data=train_data.drop(['Medical_History_10'],axis=1)train_data=train_data.drop(['Medical_History_32'],axis=1)train_data=train_data.drop(['Medical_History_24'],axis=1)train_data=train_data.drop(['Medical_History_15'],axis=1)train_data=train_data.drop(['Family_Hist_5'],axis=1)train_data=train_data.drop(['Family_Hist_3'],axis=1)histoooooooooooooryyouknowthisliketrain_data=train_data.drop(['Family_Hist_2'],axis=1)train_data=train_data.drop(['Insurance_History_5'],axis=1)train_data=train_data.drop(['Family_Hist_4'],axis=1)train_data['Employment_Info_6']=train_data['Employment_Info_6'].fillna(train_data['Employment_Info_6'].mean())train_data['Medical_History_1']=train_data['Medical_History_1'].fillna(train_data['Medical_History_1'].mean())train_data['Employment_Info_4']=train_data['Employment_Info_4'].fillna(train_data['Employment_Info_4'].mean())train_data=train_data.drop(train_data[train_data['Employment_Info_1'].isnull()].index)數(shù)據(jù)預(yù)處理——屬性值的合并與連接

在合并連接之前,需要了解pandas.groupby分組方法,因?yàn)楹芏鄷r(shí)候是對(duì)幾個(gè)屬性值變換得到新的特征值,這樣的分組方法就顯得尤其重要,例如按照同一個(gè)用戶進(jìn)行分組來(lái)計(jì)算這個(gè)用戶的行為次數(shù)當(dāng)作新的特征值等。Pandas提供了一個(gè)靈活高效的groupby功能,能以一種自然的方式對(duì)數(shù)據(jù)集進(jìn)行切片、切塊、摘要等操作。根據(jù)一個(gè)或多個(gè)鍵(可以是函數(shù)、數(shù)組或DataFrame列名)拆分Pandas對(duì)象。計(jì)算分組摘要統(tǒng)計(jì),例如計(jì)數(shù)、平均值、標(biāo)準(zhǔn)差,或用戶自定義函數(shù),對(duì)DataFrame的列應(yīng)用各種各樣的函數(shù)。應(yīng)用組內(nèi)轉(zhuǎn)換或其他運(yùn)算,例如標(biāo)準(zhǔn)化、線性回歸、排名或選取子集等,計(jì)算透視表或交叉表,執(zhí)行分位數(shù)分析以及其他分組分析。將投保人Id與用戶的保險(xiǎn)信息進(jìn)行分組,示例代碼如下。train_data.groupby(['Id','InsuredInfo_1','InsuredInfo_2','InsuredInfo_3','InsuredInfo_4','InsuredInfo_5','InsuredInfo_6','Insurance_History_1','Insurance_History_2','Insurance_History_3','Insurance_History_4','Insurance_History_7','Insurance_History_8','Insurance_History_9'],as_index=False)數(shù)據(jù)預(yù)處理——屬性值的合并與連接

對(duì)這個(gè)分組中的各列特征值進(jìn)行信息提取,產(chǎn)生新的特征。統(tǒng)計(jì)分組中InsuredInfo_1、InsuredInfo_2、...、InsuredInfo_6、Insurance_History_1、...、Insurance_History_9中的數(shù)量,并返回由Id和Infoi_count(i的取值范圍為1~13的整數(shù))組成的新的DataFrame,示例代碼如左下。使用pandas中的merge方法,以Id為合并依據(jù),將新得到的屬性列合并到train_data,示例代碼如右下。#信息提取Info1_count=train_data.groupby('Id',as_index=False)['InsuredInfo_1'].agg({'Info1_count':'count'})Info2_count=train_data.groupby('Id',as_index=False)['InsuredInfo_2'].agg({'Info2_count':'count'})Info3_count=train_data.groupby('Id',as_index=False)['InsuredInfo_3'].agg({'Info3_count':'count'})Info4_count=train_data.groupby('Id',as_index=False)['InsuredInfo_4'].agg({'Info4_count':'count'})Info5_count=train_data.groupby('Id',as_index=False)['InsuredInfo_5'].agg({'Info5_count':'count'})Info6_count=train_data.groupby('Id',as_index=False)['InsuredInfo_6'].agg({'Info6_count':'count'})Info7_count=train_data.groupby('Id',as_index=False)['Insurance_History_1']\.agg({'Info7_count':'count'})Info8_count=train_data.groupby('Id',as_index=False)['Insurance_History_2']\.agg({'Info8_count':'count'})Info9_count=train_data.groupby('Id',as_index=False)['Insurance_History_3']\.agg({'Info9_count':'count'})Info10_count=train_data.groupby('Id',as_index=False)['Insurance_History_4']\.agg({'Info10_count':'count'})Info11_count=train_data.groupby('Id',as_index=False)['Insurance_History_7']\.agg({'Info11_count':'count'})Info12_count=train_data.groupby('Id',as_index=False)['Insurance_History_8']\.agg({'Info12_count':'count'})Info13_count=train_data.groupby('Id',as_index=False)['Insurance_History_9']\.agg({'Info13_count':'count'})#屬性列合并train_data=pd.merge(train_data,Info1_count,on=['Id'],how='left')train_data=pd.merge(train_data,Info2_count,on=['Id'],how='left')train_data=pd.merge(train_data,Info3_count,on=['Id'],how='left')train_data=pd.merge(train_data,Info4_count,on=['Id'],how='left')train_data=pd.merge(train_data,Info5_count,on=['Id'],how='left')train_data=pd.merge(train_data,Info6_count,on=['Id'],how='left')train_data=pd.merge(train_data,Info7_count,on=['Id'],how='left')train_data=pd.merge(train_data,Info8_count,on=['Id'],how='left')train_data=pd.merge(train_data,Info9_count,on=['Id'],how='left')train_data=pd.merge(train_data,Info10_count,on=['Id'],how='left')train_data=pd.merge(train_data,Info11_count,on=['Id'],how='left')train_data=pd.merge(train_data,Info12_count,on=['Id'],how='left')train_data=pd.merge(train_data,Info13_count,on=['Id'],how='left')數(shù)據(jù)預(yù)處理——數(shù)值轉(zhuǎn)換

對(duì)于數(shù)據(jù)中那些不可以進(jìn)行直接量化計(jì)算的屬性,可以對(duì)其進(jìn)行轉(zhuǎn)換。數(shù)據(jù)轉(zhuǎn)換就是進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。通過(guò)構(gòu)建一個(gè)map,把這些數(shù)據(jù)轉(zhuǎn)化成可以進(jìn)行量化計(jì)算的數(shù)據(jù)。在本數(shù)據(jù)集中,只有Product_Info_2屬性需要進(jìn)行數(shù)據(jù)轉(zhuǎn)換處理(該字段為字符串類型,通過(guò)數(shù)據(jù)轉(zhuǎn)換變?yōu)檎停?。使用print(list(set(train_data['Product_Info_2'])))查看Product_Info_2數(shù)據(jù)的類別。這里使用set得到Product_Info_2中的各類別數(shù)據(jù),輸出結(jié)果為['D4','D2','A2','B2','C3','B1','A6','D3','C4','A8','A3','A5','E1','A7','D1','C1','C2','A4','A1'],以此構(gòu)建map進(jìn)行數(shù)據(jù)轉(zhuǎn)換,示例代碼如下。Product_Info_2_map={'A1':1,'A2':2,'A3':3,'A4':4,'A5':5,'A6':6,'A7':7,'A8':8,'B1':9,'B2':10,'C1':11,'C2':12,'C3':13,'C4':14,'D1':15,'D2':16,'D3':17,'D4':18,'E1':19}train_data['Product_Info_2']=train_data['Product_Info_2']\.map(Product_Info_2_map)在上述代碼中,map字典中對(duì)應(yīng)的value值需要自行設(shè)置,而且數(shù)值的大小會(huì)對(duì)屬性的作用產(chǎn)生不可忽視的影響,因此需要在理解數(shù)據(jù)的基礎(chǔ)上進(jìn)行有效地設(shè)置。在這里,設(shè)為遞增的整數(shù)數(shù)值。數(shù)據(jù)預(yù)處理——數(shù)據(jù)標(biāo)準(zhǔn)化和歸一化sklearn.preprocessing具有以下幾種對(duì)數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化和歸一化的方法。(1)preprocessing.scale()、preprocessing.StandardScaler(),使數(shù)據(jù)集呈現(xiàn)均值為0、方差為1的標(biāo)準(zhǔn)正態(tài)分布。(2)MinMaxScaler()、MaxAbsScaler(),前者使數(shù)據(jù)集分布在[0,1],后者使數(shù)據(jù)集分布在[-1,1]。這種方式通常在數(shù)據(jù)的標(biāo)準(zhǔn)差較小的情況下使用。(3)preprocessing.QuantileTransformer(),將數(shù)據(jù)映射到[0,1]之間均勻分布,但會(huì)破壞原數(shù)據(jù)之間的相關(guān)特性。(4)preprocessing.normalize(),將樣本歸一化為單位向量。通常用于計(jì)算樣本之間的相似性,也常用于文本分類和內(nèi)容聚類的向量空間模型的基礎(chǔ)。由于數(shù)據(jù)集已經(jīng)經(jīng)過(guò)離散化、歸一化處理,因而不需要再進(jìn)行進(jìn)一步地預(yù)處理。數(shù)據(jù)多維分析

數(shù)據(jù)多維分析是從數(shù)據(jù)的多個(gè)維度度量,并進(jìn)行可視化分析,常用于企業(yè)的績(jī)效管理。其中維是人們觀察事物的角度,同樣的數(shù)據(jù)從不同的維進(jìn)行觀察分析可能會(huì)得到不同的結(jié)果,同時(shí)也使用戶更加全面地認(rèn)識(shí)事物的本質(zhì)。本案例使用的數(shù)據(jù)為保誠(chéng)公司提供的投保人信息數(shù)據(jù),包括投保人的自身健康狀況以及家庭信息等各類數(shù)據(jù),總計(jì)128個(gè)屬性。案例使用Matplotlib、Seaborn、Pandas數(shù)據(jù)可視化包,對(duì)各屬性數(shù)據(jù)進(jìn)行可視化分析,研究樣本屬性與目標(biāo)Response之間的關(guān)系。對(duì)數(shù)據(jù)進(jìn)行抽樣處理,并使用plot()方法繪制散點(diǎn)圖,研究投保人年齡(Ins_Age)與投保人身體健康指數(shù)(BMI)之間的關(guān)系,示例代碼如下。得到右圖的散點(diǎn)圖train_data_Sample=train_data.sample(n=100)train_data_Sample.plot(kind='scatter',x='Ins_Age',y='BMI')plt.show()數(shù)據(jù)多維分析

使用Seaborn中的FacetGrid()方法,顯示不同屬性的分布密度。選擇以Employment_Info_2屬性為例進(jìn)行分析,代碼如下,并得到下圖的密度分布圖。sns.FacetGrid(train_data_Sample,hue="Response",size=4)\.map(sns.kdeplot,"Employment_Info_2")plt.show()數(shù)據(jù)多維分析

在對(duì)投保人進(jìn)行風(fēng)險(xiǎn)預(yù)測(cè)時(shí),需要分析對(duì)人壽保險(xiǎn)風(fēng)險(xiǎn)影響較大的屬性進(jìn)行深入分析,而投保人的身體狀況與家族史能較好地預(yù)警風(fēng)險(xiǎn)等級(jí)。在本數(shù)據(jù)集中,投保人的身體狀況可以用BMI字段表示,家族史字段可以使用Famili_Hist_1表示。選用Seaborn庫(kù)中的joinplot()方法,對(duì)BMI、Famili_Hist_1和Response進(jìn)行可視化(Response字段使用不同顏色標(biāo)記),示例代碼如下,并得到右圖的風(fēng)險(xiǎn)標(biāo)記的散點(diǎn)圖。sns.FacetGrid(train_data_Sample,hue="Response",size=4)\.map(plt.scatter,'Family_Hist_1','BMI').add_legend()plt.show()數(shù)據(jù)多維分析

使用Boxplot繪制箱圖,然后利用Striplot繪制散點(diǎn)圖,并設(shè)置jitter=True使各點(diǎn)分散,對(duì)描述投保人身體健康狀況的屬性Ins_Age、Ht、Wt、BMI,依據(jù)Response的風(fēng)險(xiǎn)評(píng)估等級(jí),對(duì)各屬性取值分布情況進(jìn)行可視化,示例代碼如下。在代碼中,使用ax的目的是保存坐標(biāo)圖,使得繪制的散點(diǎn)圖位于箱圖內(nèi),如右圖。ax1=sns.boxplot(x='Response',y='Ins_Age',data=train_data_Sample)ax1=sns.stripplot(x='Response',y="Ins_Age",data=train_data_Sample,jitter=True,edgecolor="gray")plt.show()ax2sns.boxplot(x='Response',y='Ht',data=train_data_Sample)ax2=sns.stripplot(x='Response',y="Ht",data=train_data_Sample,jitter=True,edgecolor="gray")plt.show()ax3=sns.boxplot(x='Response',y='Wt',data=train_data_Sample)ax3=sns.stripplot(x='Response',y="Wt",data=train_data_Sample,jitter=True,edgecolor="gray")plt.show()ax2=sns.boxplot(x='Response',y='BMI',data=train_data_Sample)ax2=sns.stripplot(x='Response',y="BMI",data=train_data_Sample,jitter=True,edgecolor="gray")plt.show()基于神經(jīng)網(wǎng)絡(luò)模型預(yù)測(cè)保險(xiǎn)風(fēng)險(xiǎn)

神經(jīng)網(wǎng)絡(luò)模型又稱人工神經(jīng)網(wǎng)絡(luò),是使用數(shù)學(xué)方法來(lái)模擬人類大腦神經(jīng)元工作原理的衍生物,在系統(tǒng)辨識(shí)、模式識(shí)別、智能控制等領(lǐng)域有著廣泛的前景。神經(jīng)網(wǎng)絡(luò)是機(jī)器學(xué)習(xí)算法中非常重要且應(yīng)用廣泛的一種算法,在20世紀(jì)90年代風(fēng)靡一時(shí),它由輸入層、隱藏層、輸出層構(gòu)成。輸入層用于特征數(shù)據(jù)輸入。隱藏層包含1到若干層,由模型設(shè)計(jì)者定義隱藏層的層數(shù)和每一層的神經(jīng)元數(shù)。一般情況下,定義隱藏層都擁有相同的神經(jīng)元。輸出層用來(lái)輸出預(yù)測(cè)結(jié)果。這里使用包含3個(gè)神經(jīng)元的輸入層、2個(gè)都包含5個(gè)神經(jīng)元的隱藏層,以及含有4個(gè)神經(jīng)元的輸出層的神經(jīng)網(wǎng)絡(luò)模型。

基于神經(jīng)網(wǎng)絡(luò)模型預(yù)測(cè)保險(xiǎn)風(fēng)險(xiǎn)本案例構(gòu)建的神經(jīng)網(wǎng)絡(luò)模型,使用保誠(chéng)人壽保險(xiǎn)的數(shù)據(jù)集進(jìn)行訓(xùn)練,通過(guò)不斷地優(yōu)化,訓(xùn)練得到一個(gè)可用的預(yù)測(cè)模型,對(duì)投保人的風(fēng)險(xiǎn)等級(jí)進(jìn)行評(píng)估。這里利用TensorFlow的兩個(gè)高階API(Estimator和Dataset)來(lái)構(gòu)建神經(jīng)網(wǎng)絡(luò)模型。由前面的分析可知,投保人風(fēng)險(xiǎn)等級(jí)預(yù)測(cè)是一個(gè)有監(jiān)督的機(jī)器學(xué)習(xí)的問(wèn)題,通過(guò)帶有標(biāo)簽(Response)的樣本(train.csv)進(jìn)行訓(xùn)練、評(píng)估,使用predict文件進(jìn)行評(píng)測(cè),使用TensorBoard對(duì)訓(xùn)練過(guò)程進(jìn)行可視化。通過(guò)神經(jīng)網(wǎng)絡(luò)訓(xùn)練得到神經(jīng)元之間連接的權(quán)重和神經(jīng)元的偏置(Bias),擬合樣本數(shù)據(jù),對(duì)風(fēng)險(xiǎn)等級(jí)進(jìn)行準(zhǔn)確預(yù)測(cè)。實(shí)驗(yàn)分為以下步驟:導(dǎo)入和解析數(shù)據(jù)集、描述數(shù)據(jù)、定義模型類型、定義訓(xùn)練輸入函數(shù)、訓(xùn)練模型、定義測(cè)試輸入模型、評(píng)估模型、模型預(yù)測(cè)。導(dǎo)入和解析數(shù)據(jù)集

本步驟的主要功能是實(shí)現(xiàn)數(shù)據(jù)讀取、數(shù)據(jù)預(yù)處理、訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)的劃分、輸入屬性和標(biāo)簽的劃分。具體來(lái)說(shuō),首先通過(guò)pd.read_csv()方法讀取數(shù)據(jù),然后調(diào)用preprocessing()方法對(duì)數(shù)據(jù)進(jìn)行預(yù)處理。preprocessing()完成前面對(duì)數(shù)據(jù)進(jìn)行預(yù)處理的方法。通過(guò)將DataFrame.sample()方法中的frac參數(shù)設(shè)置為1.0,實(shí)現(xiàn)對(duì)數(shù)據(jù)的隨機(jī)處理。然后通過(guò)cut_idx,將數(shù)據(jù)集劃分為訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù),并通過(guò)pop()方法分別得到訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)的Response標(biāo)簽。最后load_data()函數(shù)返回兩對(duì)訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)的feature和label元組對(duì)。#導(dǎo)入需要使用的包,并使用open()方法從文件的URL地址中打開(kāi)文件importTensorFlowastfimportpandasaspdDATA_URL=open('D:\\DataSet\\Prudential_Life_Insurance_Assessment''\\train\\train.csv')PREDICT_URL=open('D:\\DataSet\\Prudential_Life_Insurance_''Assessment\\test\\test.csv')#定義load_data()加載函數(shù)defload_data(label_name='Response'):data=pd.read_csv(filepath_or_buffer=DATA_URL)data=preprocessing(data)data=data.sample(frac=1.0)cut_idx=int(round(0.2*data.shape[0]))train_data=data.iloc[cut_idx:]test_data=data.iloc[:cut_idx]train_features=train_datatrain_labels=train_data.pop(label_name)train_labels=[str(i)foriintrain_labels]test_features=test_datatest_labels=test_data.pop(label_name)test_labels=[str(i)foriintest_labels]return(train_features,train_labels),(test_features,test_labels)導(dǎo)入和解析數(shù)據(jù)集cut_idx主要實(shí)現(xiàn)簡(jiǎn)單交叉驗(yàn)證:首先隨機(jī)地將已知數(shù)據(jù)分為訓(xùn)練集和測(cè)試集,本例中80%的數(shù)據(jù)作為訓(xùn)練集,20%的數(shù)據(jù)作為測(cè)試集。然后用訓(xùn)練集在各種條件下(不同的參數(shù)個(gè)數(shù))訓(xùn)練模型,從而得到不同的模型。在測(cè)試集上評(píng)價(jià)各個(gè)模型的性能,選出誤差最小的模型。#調(diào)用load_data()方法會(huì)返回兩個(gè)(feature和label)對(duì),分別對(duì)應(yīng)訓(xùn)練集和測(cè)試集(train_features,train_labels),(test_features,test_labels)=\load_data()描述數(shù)據(jù)

特征列是一種數(shù)據(jù)結(jié)構(gòu),告知模型如何解讀每個(gè)屬性中的數(shù)據(jù)。在人壽保險(xiǎn)的風(fēng)險(xiǎn)預(yù)測(cè)問(wèn)題中,將每個(gè)屬性中的數(shù)據(jù)解讀為其字面意義的浮點(diǎn)值。例如,對(duì)于2.1這樣的數(shù)據(jù),模型讀取為2.1,而不是讀取為整型數(shù)值2。使用tf.feature_column模塊中的函數(shù)來(lái)構(gòu)建feature_column列表,其中每一個(gè)對(duì)象描述了模型的一個(gè)輸入。要讓模型解讀為浮點(diǎn)值,需要調(diào)用tf.feature_column().numerc_column()方法,示例代碼如下。my_features_columns=[]forkeyintrain_features.keys():my_features_columns.append(tf.feature_column.numeric_column(key=key))定義模型類型

選擇將要進(jìn)行訓(xùn)練的模型。神經(jīng)網(wǎng)絡(luò)具有多種類型,選擇理想的類型往往需要豐富的經(jīng)驗(yàn)。這里使用Estiamtor類實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò),通過(guò)實(shí)現(xiàn)tf.estimator.DNNClassifer,Estimator將創(chuàng)建一個(gè)對(duì)樣本進(jìn)行分類的神經(jīng)網(wǎng)絡(luò),示例代碼如下。以上的代碼調(diào)用將實(shí)例化DNNClassifer,參數(shù)如下。feature_column參數(shù)定義了模型的輸入特征。hidden_units參數(shù)定義了神經(jīng)網(wǎng)絡(luò)內(nèi)每個(gè)隱藏層的神經(jīng)元數(shù)量,而此參數(shù)接受一個(gè)列表,分配的列表長(zhǎng)度代表了隱藏層的層數(shù),列表中的數(shù)值代表了特定隱藏層中的神經(jīng)元的個(gè)數(shù)(本例中,第一個(gè)隱藏層和第二個(gè)隱藏層都有200個(gè)神經(jīng)元)。要想改變神經(jīng)元或隱藏層的數(shù)量,只需要改變給hidden_units參數(shù)分配的列表即可增加隱藏層和神經(jīng)元的數(shù)量可能會(huì)產(chǎn)生更強(qiáng)大的模型,但這需要更多數(shù)據(jù)才能有效地進(jìn)行訓(xùn)練。一般來(lái)說(shuō),每層神經(jīng)元的個(gè)數(shù)多于輸入屬性的數(shù)量。n_classes參數(shù)定義了模型可以預(yù)測(cè)的值的數(shù)量。在本例中,Response標(biāo)簽總共有8種風(fēng)險(xiǎn)級(jí)別,因而設(shè)置n_classes的值為8。label_vocabulary參數(shù)定義了模型可以預(yù)測(cè)的潛在值。這里需要設(shè)置label_vocabulary參數(shù)的原因是在DNNClassifer中,如果不做定義,預(yù)測(cè)的值則為默認(rèn)的{0,1,…,n_classes-1}。而在本例中,Response標(biāo)簽的值為{1,2,…,8},因而需要自定義label_vocabulary。還有一種處理方法是將Response標(biāo)簽的數(shù)據(jù)都減去1進(jìn)行訓(xùn)練預(yù)測(cè),然后再將其加1。本例中,采用自定義的預(yù)測(cè)值。使用自定義的預(yù)測(cè)值時(shí),需要確保預(yù)測(cè)值為字符串類型,而樣本數(shù)據(jù)中Response標(biāo)簽為數(shù)值,因而需要進(jìn)行字符串轉(zhuǎn)化。最后,在load_data()中對(duì)Response(標(biāo)簽)中的數(shù)值進(jìn)行了字符串轉(zhuǎn)化得到uniqueLabel,代碼表示為:uniqueLabel=list(set(train_labels))classifier=tf.estimator.DNNClassifier(feature_columns=my_features_columns,hidden_units=[200,200],n_classes=8,label_vocabulary=uniqueLabel)訓(xùn)練模型在定義模型時(shí),已經(jīng)實(shí)例化了tf.Estimator.DNNClassifer。這時(shí),基本上已經(jīng)構(gòu)建了一個(gè)神經(jīng)網(wǎng)絡(luò)。訓(xùn)練神經(jīng)網(wǎng)絡(luò)需要調(diào)用tf.Estimator.train()方法:classifier.train(input_fn=lambda:train_input_fn(train_features,train_labels,4000),steps=1000)input_fn參數(shù)用來(lái)傳入數(shù)據(jù)流,通過(guò)調(diào)用train_input_fn()方法,得到返回的輸入數(shù)據(jù)流;steps參數(shù)指示train()方法在完成指定的迭代次數(shù)后停止訓(xùn)練。定義測(cè)試輸入模型通過(guò)上述步驟,已經(jīng)對(duì)模型batch_size(本例中為4000)批次的數(shù)據(jù)進(jìn)行了訓(xùn)練。然后使用測(cè)試數(shù)據(jù)對(duì)訓(xùn)練得到的模型進(jìn)行測(cè)試,對(duì)神經(jīng)網(wǎng)絡(luò)的權(quán)重和偏置進(jìn)行調(diào)整來(lái)優(yōu)化整個(gè)模型。在tf.Estimator對(duì)象中,提供了evaluate()方法來(lái)評(píng)估模型,示例代碼如下。上述代碼中,判斷l(xiāng)abels是否為空是為了將eval_input_fn()這個(gè)輸入方法用作后期進(jìn)行預(yù)測(cè)的輸入函數(shù)。當(dāng)labels為空時(shí),這個(gè)輸入函數(shù)是模型預(yù)測(cè)的輸入函數(shù);當(dāng)labels不為空時(shí),這個(gè)輸入函數(shù)是模型評(píng)估的輸入函數(shù)。其他將數(shù)據(jù)類型轉(zhuǎn)化為tf.data.Dataset對(duì)象的實(shí)現(xiàn)方式與train_input_fn()方法類似。defeval_input_fn(features,labels=None,batch_size=None):iflabelsisNone:inputs=dict(features)else:inputs=(dict(features),labels)dataset=tf.data.Dataset.from_tensor_slices(inputs)assertbatch_sizeisnotNone,'batch_sizemustnotNone'dataset=dataset.batch(batch_size)returndataset.make_one_shot_iterator().get_next()評(píng)估模型為了評(píng)估模型的效果,每一個(gè)Estimator對(duì)象都定義evaluate()方法來(lái)評(píng)估模型,示例代碼如下。從上述代碼中可以看出,其參數(shù)input_fn與train()方法一致,打印出這個(gè)模型的預(yù)測(cè)準(zhǔn)確率如下。Testsetaccuracy:0.423此模型的預(yù)測(cè)準(zhǔn)確率為42.3%。eval_result=classifier.evaluate(input_fn=lambda:eval_input_fn(test_features,test_labels,11872))print('\nTestsetaccuracy:{accuracy:0.3f}\n'.format(**eval_result))模型預(yù)測(cè)Estimator對(duì)象同樣定義了predict()方法來(lái)使用訓(xùn)練得到的模型進(jìn)行預(yù)測(cè)。輸入預(yù)測(cè)數(shù)據(jù),使用訓(xùn)練得到的模型進(jìn)行預(yù)測(cè),示例代碼如下。predict_data=pd.read_csv(PREDICT_URL)predict_data=preprocessing(predict_data)predictions=classifier.predict(input_fn=lambda:eval_input_fn(predict_data,batch_size=19765))使用SVM預(yù)測(cè)保險(xiǎn)風(fēng)險(xiǎn)

SVM是一種十分常用且非常有效的分類器,在解決小樣本、非線性及高維模式識(shí)別中展現(xiàn)出許多特有的優(yōu)勢(shì)。SVM將向量映射到一個(gè)更高維的空間里,在這個(gè)空間里建立一個(gè)最大間隔超平面。在劃分?jǐn)?shù)據(jù)的超平面的兩邊找到兩個(gè)互相平行的超平面,合適的分隔超平面使兩個(gè)平行的超平面間的距離最大化。下面使用TensorFlow構(gòu)建一個(gè)SVM模型。通過(guò)手動(dòng)構(gòu)建TensorFlow的靜態(tài)圖和SVM模型,可使讀者更好地理解TensorFlow的運(yùn)作機(jī)制和在機(jī)器學(xué)習(xí)算法的應(yīng)用。在TensorFlow的默認(rèn)Graph中創(chuàng)建ops,并使用placeholder()作為數(shù)據(jù)的輸入容器,然后通過(guò)sess.run()指示TensorFlow運(yùn)行圖的相應(yīng)節(jié)點(diǎn)。通過(guò)對(duì)用戶信息的不斷訓(xùn)練,得到可用的預(yù)測(cè)模型。實(shí)驗(yàn)的主要步驟如下:解析數(shù)據(jù)集并交叉驗(yàn)證、數(shù)據(jù)預(yù)處理、繪制數(shù)據(jù)流圖、定義高斯核函數(shù)、創(chuàng)建對(duì)偶損失函數(shù)、創(chuàng)建預(yù)測(cè)核函數(shù)、創(chuàng)建預(yù)測(cè)函數(shù)、設(shè)置優(yōu)化器并初始化、訓(xùn)練并評(píng)估模型。解析數(shù)據(jù)集并交叉驗(yàn)證

首先導(dǎo)入相應(yīng)的工具包,導(dǎo)入os是為了設(shè)置Python的信息提示等級(jí)。通過(guò)設(shè)置os.environ['TF_CPP_MIN_LOG_LEVEL']='3',編輯器只顯示Error結(jié)果的提示信息。定義load_data()函數(shù)加載數(shù)據(jù)集,把數(shù)據(jù)劃分為訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù),示例代碼如下。加載數(shù)據(jù)的過(guò)程與神經(jīng)網(wǎng)絡(luò)的加載函數(shù)類似,最后返回的也是兩對(duì)屬性和標(biāo)簽的元組對(duì)。importosimportnumpyasnpimportpandasaspdimportTensorFlowastfdefload_data():data=pd.read_csv('D:\\DataSet\\Prudential_Life_Insurance_''Assessment\\train\\train.csv')data=preprocessing(data)data=data.sample(frac=1.0)cut_idx=int(round(0.2*data.shape[0]))train_data=data[cut_idx:]test_data=data[:cut_idx]train_feature=train_datatrain_label=train_data.pop('Response')test_feature=test_datatest_label=test_data.pop('Response')return(train_feature,train_label),(test_feature,test_label)數(shù)據(jù)預(yù)處理

定義preprocessing()數(shù)據(jù)預(yù)處理函數(shù),此部分?jǐn)?shù)據(jù)的預(yù)處理已在前述預(yù)處理章節(jié)說(shuō)明,示例代碼如下。defpreprocessing(data):data=data.drop(['Medical_History_10'],axis=1)data=data.drop(['Medical_History_32'],axis=1)data=data.drop(['Medical_History_24'],axis=1)data=data.drop(['Medical_History_15'],axis=1)data=data.drop(['Family_Hist_5'],axis=1)data=data.drop(['Family_Hist_3'],axis=1)data=data.drop(['Family_Hist_2'],axis=1)data=data.drop(['Insurance_History_5'],axis=1)data=data.drop(['Family_Hist_4'],axis=1)data=data.drop(['Id'],axis=1)data=data.drop(['Product_Info_2'],axis=1)data['Employment_Info_6']=data['Employment_Info_6'].fillna(data['Employment_Info_6'].mean())data['Medical_History_1']=data['Medical_History_1'].fillna(data['Medical_History_1'].mean())data['Employment_Info_4']=data['Employment_Info_4'].fillna(data['Employment_Info_4'].mean())data=data.drop(data[data['Employment_Info_1'].isnull()].index)returndata數(shù)據(jù)預(yù)處理

定義初始化label的函數(shù)。分類風(fēng)險(xiǎn)共分為8個(gè)等級(jí),需要采用one-vs-all的策略把風(fēng)險(xiǎn)等級(jí)轉(zhuǎn)變?yōu)?個(gè)二分類實(shí)現(xiàn),即構(gòu)建一個(gè)8維的向量,使用向量中的每一個(gè)維度的索引來(lái)表示風(fēng)險(xiǎn)等級(jí),每一個(gè)維度的值使用1或者-1標(biāo)識(shí)(1表示取該風(fēng)險(xiǎn)等級(jí),一個(gè)8維向量只有一個(gè)維度的值為1,其余都為-1)。通過(guò)遍歷這個(gè)標(biāo)簽label,將其對(duì)應(yīng)值進(jìn)行修改,并將各種已分類的target_label_i合并,得到target_labels矩陣。使用astype(np.float32)將數(shù)據(jù)修改為浮點(diǎn)型32類型的數(shù),這樣做的目的是統(tǒng)一數(shù)據(jù)格式,示例代碼如下。definit_data(target_label):target_label_1=np.array([1iflabel==1else0forlabelintarget_label])target_label_2=np.array([1iflabel==2else0forlabelintarget_label])target_label_3=np.array([1iflabel==3else0forlabelintarget_label])target_label_4=np.array([1iflabel==4else0forlabelintarget_label])target_label_5=np.array([1iflabel==5else0forlabelintarget_label])target_label_6=np.array([1iflabel==6else0forlabelintarget_label])target_label_7=np.array([1iflabel==7else0forlabelintarget_label])target_label_8=np.array([1iflabel==8else0forlabelintarget_label])target_labels=np.array([target_label_1,target_label_2,target_label_3,target_label_4,target_label_5,target_label_6,target_label_7,target_label_8])\astype(np.float32)returntarget_labels數(shù)據(jù)預(yù)處理

最后,調(diào)用這些函數(shù),對(duì)數(shù)據(jù)集進(jìn)行預(yù)處理,作為訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)對(duì)模型進(jìn)行訓(xùn)練和檢測(cè),示例代碼如下。(train_feature,train_label),(test_feature,test_label)=\load_data()train_feature=np.array(train_feature).astype(np.float32)train_labels=init_data(train_label)test_feature=np.array(test_feature).astype(np.float32)test_labels=init_data(test_label)繪制數(shù)據(jù)流圖

TensorFlow使用數(shù)據(jù)流圖表示步驟之間的依賴關(guān)系。數(shù)據(jù)流是一種用于并行計(jì)算的常用編程模型。在數(shù)據(jù)流圖中,節(jié)點(diǎn)表示計(jì)算單元,邊表示計(jì)算使用或產(chǎn)生的數(shù)據(jù)。使用TensorFlow的默認(rèn)圖來(lái)構(gòu)建數(shù)據(jù)流圖。首先使用tf.Session()來(lái)創(chuàng)建TensorFlowSession,示例代碼如下。sess=tf.Session()

使用tf.placeholder()構(gòu)建一個(gè)饋送的張量的占位符。在TensorFlow中,如果需要評(píng)估該張量是否產(chǎn)生錯(cuò)誤,可以使用Session.run()、Tensor.eval()或Operation.run()的feed_dict可選參數(shù)來(lái)饋送。創(chuàng)建features_input、label、predict_risk三個(gè)占位符,分別表示數(shù)據(jù)輸入、樣本標(biāo)簽輸入和風(fēng)險(xiǎn)預(yù)測(cè)屬性輸入,示例代碼如下。

在placeholder()中,shape參數(shù)表示占位符的形狀,dtype參數(shù)規(guī)定數(shù)據(jù)類型(本例中為float32)。在參數(shù)shape中,如果未定義張量的形狀,那么placeholder()將依據(jù)輸入張量的大小生成相應(yīng)形狀規(guī)模的張量。features_input=tf.placeholder(shape=[None,116],dtype=tf.float32)label=tf.placeholder(shape=[8,None],dtype=tf.float32)predict_risk=tf.placeholder(shape=[None,116],dtype=tf.float32)繪制數(shù)據(jù)流圖

在placeholder()中,shape參數(shù)表示占位符的形狀,dtype參數(shù)規(guī)定數(shù)據(jù)類型(本例中為float32)。在參數(shù)shape中,如果未定義張量的形狀,那么placeholder()將依據(jù)輸入張量的大小生成相應(yīng)形狀規(guī)模的張量。TensorFlow變量表示程序處理的共享持久狀態(tài)的最佳方法。變量通過(guò)tf.Variable類進(jìn)行操作。tf.Variable表示張量,通過(guò)運(yùn)行op可以改變它的值。與tf.Tensor對(duì)象不同,tf.Variable存在于單個(gè)session.run()調(diào)用的上下文。在內(nèi)部,tf.Variable存儲(chǔ)持久張量。具體的op允許讀取和修改該張量的值。這些修改在多個(gè)tf.Session之間是可見(jiàn)的,因此對(duì)于一個(gè)tf.Variable,多個(gè)工作器可以看到相同的值。使用tf.Variable()創(chuàng)建變量b,b為8行batch_size列的張量,作為訓(xùn)練的參數(shù)。batch_size為每一次訓(xùn)練模型的大小,在支持向量機(jī)中,這代表了特征項(xiàng)的數(shù)目,示例代碼如下。batch_size=5000w=tf.Variable(tf.random_normal(shape=[8,batch_size]))tf.random_nomal()表示從正態(tài)分布中輸出形狀為shape=[8,batch_size]的隨機(jī)值。定義高斯核函數(shù)(RBF核函數(shù))

核函數(shù)是SVM中的核心內(nèi)容,其主要作用是將樣例特征映射到高維空間中,將線性不可分問(wèn)題轉(zhuǎn)化為線性可分問(wèn)題。常用的核函數(shù)包括線性核函數(shù)、多項(xiàng)式核函數(shù)、RBF核函數(shù)和Sigmoid核函數(shù)等,不同的核函數(shù)適用于不同的場(chǎng)景。在本例應(yīng)用RBF核函數(shù),示例代碼如下。在上述代碼中,使用tf.constant()定義了一個(gè)gamma常量,賦值為-5.0。tf.transpose()的作用是轉(zhuǎn)置張量,tf.matmul()實(shí)現(xiàn)兩個(gè)張量相乘(相當(dāng)于矩陣相乘),tf.multiply()實(shí)現(xiàn)乘法,tf.exp()計(jì)算e的指數(shù)倍。#Gaussiankernelfunctionw=tf.multiply(label,w)gamma=tf.constant(-10.0)dist=tf.reduce_sum(tf.square(features_input),1)dist=tf.reshape(dist,[-1,1])sq_dists=tf.add(tf.subtract(dist,tf.multiply(2.,tf.matmul(features_input,tf.transpose(features_input)))),tf.transpose(dist))my_kernel=tf.exp(tf.multiply(gamma,tf.abs(sq_dists)))創(chuàng)建對(duì)偶損失函數(shù)在計(jì)算對(duì)偶損失函數(shù)時(shí),需要實(shí)現(xiàn)批量矩陣乘法,最終的結(jié)果是8維矩陣,并且需要傳播矩陣乘法,所以數(shù)據(jù)矩陣和目標(biāo)矩陣需要進(jìn)行預(yù)處理。在這里創(chuàng)建一個(gè)函數(shù)來(lái)擴(kuò)展矩陣維度,然后再進(jìn)行矩陣轉(zhuǎn)置,示例代碼如下。tf.expand_dims()為矩陣增加一個(gè)維度,tf.reshape()重構(gòu)張量維度結(jié)構(gòu),tf.matmul()實(shí)現(xiàn)matT·mat。在對(duì)矩陣進(jìn)行預(yù)處理之后,使用對(duì)偶優(yōu)化函數(shù)求解模型的損失,示例代碼如下。其中tf.reduce_sum()實(shí)現(xiàn)張量?jī)?nèi)部求和,依據(jù)給定的參數(shù)值,按照不同的方式進(jìn)行求解(每一個(gè)axis值將減少?gòu)埩恳粋€(gè)維度)。當(dāng)axis為1時(shí),表示將行向量?jī)?nèi)部求和。當(dāng)axis為0時(shí),表示將張量列內(nèi)部求和。當(dāng)不對(duì)axis進(jìn)行賦值時(shí),默認(rèn)將張量的維度壓縮到1,即對(duì)張量中所有的值進(jìn)行求和。在本例中,使用參數(shù)[1,2]表示張量先按照行內(nèi)部求和,再將不同行的對(duì)應(yīng)列相加。tf.negative()對(duì)值進(jìn)行求反,tf.substract()做減法。defreshape_matmul(mat):mat1=tf.expand_dims(mat,dim=1)mat2=tf.reshape(mat1,[8,batch_size,1])returntf.matmul(mat2,mat1)#計(jì)算對(duì)偶損失函數(shù)。first_term=tf.reduce_sum(w)b_vec_cross=tf.matmul(tf.transpose(w),w)label_cross=reshape_matmul(label)second_term=tf.reduce_sum(tf.multiply(my_kernel,tf.multiply(b_vec_cross,label_cross)),[1,2])loss=tf.reduce_sum(tf.negative(tf.subtract(first_term,second_term)))創(chuàng)建預(yù)測(cè)核函數(shù)預(yù)測(cè)核函數(shù)用于對(duì)輸入特征數(shù)據(jù)進(jìn)行風(fēng)險(xiǎn)預(yù)測(cè),示例代碼如下。tf.square()將張量中的每一個(gè)值進(jìn)行平方處理。tf.reshape()對(duì)張量進(jìn)行重構(gòu),重構(gòu)的張量的shape與所給的參數(shù)一致。但在reshape()中,有一個(gè)特殊參數(shù)-1。在本例中,參數(shù)[-1,1]表示將張量構(gòu)建為一個(gè)列向量。其中需要注意tf.reduce_sum()的參數(shù)。tf.add()實(shí)現(xiàn)求和運(yùn)算。pred_dist=tf.reduce_sum(tf.square(tf.transpose(predict_risk)),1)pred_dist=tf.reshape(pred_dist,[-1,1])pred_sq_dists=tf.add(tf.subtract(pred_dist,tf.multiply(2.,tf.matmul(tf.transpose(predict_risk),predict_risk))),tf.transpose(pred_dist))pred_kernel=tf.exp(tf.multiply(gamma,sq_dists))創(chuàng)建預(yù)測(cè)函數(shù)實(shí)現(xiàn)預(yù)測(cè)核函數(shù)后,創(chuàng)建預(yù)測(cè)函數(shù)。與二分類不同的是,不需要對(duì)模型的輸出進(jìn)行sign()運(yùn)算。因?yàn)檫@里實(shí)現(xiàn)的是one-vs-all(一對(duì)多)方法,所以預(yù)測(cè)值是分類器最大返回值的類別。使用TensorFlow的內(nèi)建函數(shù)argmax()來(lái)實(shí)現(xiàn)該功能,示例代碼如下。上述代碼中,tf.argmax()返回最大值的索引。tf.reduce_mean()求平均值。tf.equal()判斷兩個(gè)張量對(duì)應(yīng)維度的數(shù)值是否相等,相等則相應(yīng)維度值取1,否則取0,最后返回的是一個(gè)布爾類型的張量。本方法實(shí)現(xiàn)了對(duì)風(fēng)險(xiǎn)類型的預(yù)測(cè),得到prediction,并得到模型的預(yù)測(cè)準(zhǔn)確度(Accuracy)。prediction_output=tf.matmul(w,pred_kernel)prediction=tf.argmax(prediction_output-tf.expand_dims(tf.re

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論