Python程序設(shè)計課件-第8章數(shù)據(jù)挖掘_第1頁
Python程序設(shè)計課件-第8章數(shù)據(jù)挖掘_第2頁
Python程序設(shè)計課件-第8章數(shù)據(jù)挖掘_第3頁
Python程序設(shè)計課件-第8章數(shù)據(jù)挖掘_第4頁
Python程序設(shè)計課件-第8章數(shù)據(jù)挖掘_第5頁
已閱讀5頁,還剩87頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

高級大數(shù)據(jù)人才培養(yǎng)叢書張雪萍主編唐萬梅副主編景雪琴副主編BIGDATA劉鵬張燕總主編Python程序設(shè)計8.1

Python常用數(shù)據(jù)分析工具8.2

數(shù)據(jù)預(yù)處理8.3分類與預(yù)測8.5實戰(zhàn):信用評估習(xí)題8.4

聚類分析of562高級大數(shù)據(jù)人才培養(yǎng)叢書8.6實戰(zhàn):影片推薦系統(tǒng)第八章數(shù)據(jù)挖掘***Python常用數(shù)據(jù)分析工具第八章數(shù)據(jù)挖掘of313***NumpyNumPy提供了真正的數(shù)組功能,以及對數(shù)據(jù)進(jìn)行快速處理的函數(shù)。NumPy安裝:

方式一:

pipinstallnumpy方式二:pythonsetup.pyinstallNumPy基本操作:#-*-coding:utf-8-*importnumpyasnp#一般以np作為numpy的別名a=np.array([2,8,5,7])#創(chuàng)建數(shù)組print(a)#輸出數(shù)組print(a[:3])#引用前三個數(shù)字(切片)print(a.min())#輸出a的最小值a.sort()#將a的元素從小到大排序,此操作直接修改a,因此這時候a為[2,5,7,8]b=np.array([[1,2,3],[4,5,6]])#創(chuàng)建二維數(shù)組print(b*b)#輸出數(shù)組的平方陣,即[(1,4,9),(16,25,36)]***Python常用數(shù)據(jù)分析工具第八章數(shù)據(jù)挖掘of314***ScipyScipy提供了真正的矩陣,以及大量基于矩陣運(yùn)算的對象與函數(shù)。Scipy依賴于NumPy,安裝它之前得先安裝NumPy。安裝好Scipy后,可以通過以下命令進(jìn)行簡單測試。用Scipy求解非線性方程組和數(shù)值積分:#-*-coding:utf-8-*#求解非線性方程組2x1-x2^2=1,x1^2-x2=2fromscipy.optimizeimportfsolve#導(dǎo)入求解方程組的函數(shù)#定義要求解的方程組deff(x):x1=x[0]x2=x[1]return[2*x1-x2**2-1,x1**2-x2-2]result=fsolve(f,[1,1])#輸入初值[1,1]并求解print(result)#輸出結(jié)果:array([1.91963957,1.68501606])#數(shù)值積分fromscipyimportintegrate#導(dǎo)入積分函數(shù)defg(x):#定義被積函數(shù)return(1-x**2)**0.5pi_2,err=integrate.quad(g,-1,1)#積分結(jié)果和誤差print(pi_2*2)#由微積分知識可知,積分結(jié)果為圓周率pi的一半***Python常用數(shù)據(jù)分析工具第八章數(shù)據(jù)挖掘of315***PandasPandas是Python中強(qiáng)大的數(shù)據(jù)分析和探索工具,它包含高級的數(shù)據(jù)結(jié)構(gòu)和精巧的工具,使得在Python中處理數(shù)據(jù)非常快速和簡單。Pandas的功能非常強(qiáng)大,支持類似SQLServer數(shù)據(jù)庫的數(shù)據(jù)增、刪、查、改操作,并且?guī)в胸S富的數(shù)據(jù)處理函數(shù);支持時間序列分析;支持靈活處理缺失數(shù)據(jù)等。Pandas的安裝過程跟普通的第三方庫一樣,但如果需要讀取和寫入Excel數(shù)據(jù),還需要安裝xlrd庫(讀)和xlwt庫(寫)。其安裝方法如下:

pipinstallxlrd#為Python添加讀取Excel數(shù)據(jù)的功能

pipinstallxlwt#為Python添加寫入Excel數(shù)據(jù)的功能***Python常用數(shù)據(jù)分析工具第八章數(shù)據(jù)挖掘of316***PandasPandas基本的數(shù)據(jù)結(jié)構(gòu)是Series和DataFrame。Series是序列,類似一維數(shù)組;DataFrame相當(dāng)于一張二維的表格,類似二維數(shù)組,它的每一列都是一個Series。為了定位Series中的元素,pandas提供了Index對象,每個Series都會有一個對應(yīng)的Index,用來標(biāo)記不同的元素。Index的內(nèi)容不一定是數(shù)字,也可以是字母、漢字等。類似地,DataFrame相當(dāng)于多個有同樣Index的Series的組合,每個Series都有唯一的表頭,用來標(biāo)識不同的Series。

Pandas簡例:#-*-coding:utf-8-*importpandasaspd#通常用pd作為pandas的別名。s=pd.Series([1,2,3],index=['a','b','c'])#創(chuàng)建一個序列sd=pd.DataFrame([[1,2,3],[4,5,6]],columns=['a','b','c'])#創(chuàng)建一個表d2=pd.DataFrame(s)#也可以用已有的序列來創(chuàng)建表格d.head()#預(yù)覽前5行數(shù)據(jù)d.describe()#數(shù)據(jù)基本統(tǒng)計量#讀取文件,注意文件的存儲路徑不能有中文,否則,讀取可能出錯pd.read_excel('data.xls')#讀取Excel文件,創(chuàng)建DataFramepd.read_csv(‘data.csv’,encoding=‘utf-8’)#讀文本格式數(shù)據(jù),encoding指定編碼***Python常用數(shù)據(jù)分析工具第八章數(shù)據(jù)挖掘of317***Scikit-LearnScikit-Learn是Python中強(qiáng)大的機(jī)器學(xué)習(xí)工具包,它提供了完善的機(jī)器學(xué)習(xí)工具箱,包括數(shù)據(jù)預(yù)處理、分類、回歸、聚類、預(yù)測和模型分析等。Scikit-Learn依賴于NumPy、Scipy和Matplotlib,安裝方法與普通第三方庫的安裝類似。創(chuàng)建一個機(jī)器學(xué)習(xí)模型:#-*-coding:utf-8-*fromsklearn.linear_modelimportLinearRegression#導(dǎo)入線性回歸模型model=LinearRegression()#建立線性回歸模型print(model)1)所有模型提供的接口model.fit():訓(xùn)練模型,對于監(jiān)督模型是fit(X,y),對于非監(jiān)督模型是fit(X)。2)監(jiān)督模型提供的接口model.predict(X_new):預(yù)測新樣本。model.predict_proba(X_new):預(yù)測概率,僅對某些模型有用(如LR)。model.score():得分越高,擬合越好。3)非監(jiān)督模型提供的接口model.transform():從數(shù)據(jù)中學(xué)到新的“基空間”。model.fit_transform():從數(shù)據(jù)中學(xué)到新的基并將這個數(shù)據(jù)按照這組“基”進(jìn)行轉(zhuǎn)換。***Python常用數(shù)據(jù)分析工具第八章數(shù)據(jù)挖掘of318***Scikit-LearnScikit-Learn本身提供了一些實例數(shù)據(jù),比較常見的有安德森鶯尾花卉數(shù)據(jù)集、手寫圖像數(shù)據(jù)集等。Scikit-Learn簡例:#-*-coding:utf-8-*fromsklearnimportdatasets#導(dǎo)入數(shù)據(jù)集iris=datasets.load_iris()#加載數(shù)據(jù)集print(iris.data.shape)#查看數(shù)據(jù)集大小fromsklearnimportsvm#導(dǎo)入SVM模型clf=svm.LinearSVC()#建立線性SVM分類器clf.fit(iris.data,iris.target)#用數(shù)據(jù)訓(xùn)練模型clf.predict([[3.6,5.9,1.4,2.35]])#訓(xùn)練好模型之后,輸入新的數(shù)據(jù)進(jìn)行預(yù)測clf.coef_#查看訓(xùn)練好模型的參數(shù)8.1

Python常用數(shù)據(jù)分析工具8.2

數(shù)據(jù)預(yù)處理8.3分類與預(yù)測8.5實戰(zhàn):信用評估習(xí)題8.4

聚類分析of569高級大數(shù)據(jù)人才培養(yǎng)叢書8.6實戰(zhàn):影片推薦系統(tǒng)第八章數(shù)據(jù)挖掘***數(shù)據(jù)預(yù)處理第八章數(shù)據(jù)挖掘of3110在實際的數(shù)據(jù)挖掘中,海量的原始數(shù)據(jù)中存在大量信息不完整(有缺失值)、信息表達(dá)不一致、有異常(受噪聲影響)的數(shù)據(jù),無法直接進(jìn)行數(shù)據(jù)挖掘,或挖掘結(jié)果差強(qiáng)人意。為了提高數(shù)據(jù)挖掘的質(zhì)量,產(chǎn)生了數(shù)據(jù)預(yù)處理(DataPreprocessing)技術(shù)。統(tǒng)計發(fā)現(xiàn),在數(shù)據(jù)挖掘的過程中,數(shù)據(jù)預(yù)處理工作量占到了整個過程的60%。數(shù)據(jù)預(yù)處理有多種方法:數(shù)據(jù)清理(DataCleaning)、數(shù)據(jù)集成(DataIntegration)、數(shù)據(jù)變換(DataTransformation)等。這些數(shù)據(jù)預(yù)處理技術(shù)在數(shù)據(jù)挖掘之前使用,大大提高了數(shù)據(jù)挖掘模式的質(zhì)量,降低了實際挖掘所需要的時間。***數(shù)據(jù)預(yù)處理第八章數(shù)據(jù)挖掘of3111***數(shù)據(jù)清洗數(shù)據(jù)清理是進(jìn)行數(shù)據(jù)預(yù)處理的首要方法,它通過識別或刪除離群點來光滑噪聲數(shù)據(jù),并填補(bǔ)缺失值,從而“清理”數(shù)據(jù)。數(shù)據(jù)清理的主要任務(wù)是處理缺失值、光滑噪聲數(shù)據(jù)。1.處理缺失值處理缺失值通常包括以下幾類方法:(1)刪除元組(2)人工填寫缺失值(3)中心度量填補(bǔ)(4)多重填補(bǔ)(5)使用最可能的值填補(bǔ)***數(shù)據(jù)預(yù)處理第八章數(shù)據(jù)挖掘of3112***數(shù)據(jù)清洗

2.光滑噪聲數(shù)據(jù)光滑噪聲數(shù)據(jù)主要有以下幾種方法:(1)分箱。其主要思想為每一個數(shù)據(jù)與它的“近鄰”數(shù)據(jù)應(yīng)該是相似的,因此將數(shù)據(jù)用其近鄰(“箱”或“桶”)替代,這樣既可以光滑有序數(shù)據(jù)值,還能在一定程度上保持?jǐn)?shù)據(jù)的獨有特點。(2)回歸。回歸技術(shù)是通過一個映像或函數(shù)擬合多個屬性數(shù)據(jù),從而達(dá)到光滑數(shù)據(jù)的效果。線性回歸是尋找一條“最佳”直線來擬合多個屬性,從而使用其中的某些屬性預(yù)測其他屬性。(3)離群點分析。聚類可以將相似的值歸為同一“簇”,因此主要使用聚類等技術(shù)來檢測離群點。聚類技術(shù)將在8.3節(jié)展開討論。***數(shù)據(jù)預(yù)處理第八章數(shù)據(jù)挖掘of3113***數(shù)據(jù)集成數(shù)據(jù)挖掘需要的數(shù)據(jù)往往分布在不同的數(shù)據(jù)源中,數(shù)據(jù)集成就是將多個數(shù)據(jù)源合并存放在一個一致的數(shù)據(jù)存儲(如數(shù)據(jù)倉庫)中的過程。在實際應(yīng)用中,數(shù)據(jù)集成解決3類問題:實體識別、冗余和相關(guān)分析,以及數(shù)值沖突的檢測與處理。1.實體識別實體識別是指從不同數(shù)據(jù)源識別現(xiàn)實世界的實體,它的任務(wù)是統(tǒng)一不同源數(shù)據(jù)的矛盾之處。例如,一個數(shù)據(jù)庫中的屬性名student_id與另一個數(shù)據(jù)庫中的屬性名student_number表示的含義是否相同。每個屬性的元數(shù)據(jù)包括屬性名、現(xiàn)實含義、數(shù)據(jù)類型、取值范圍,以及處理零或空白時的空值規(guī)則。元數(shù)據(jù)的統(tǒng)一設(shè)計不僅可以有效避免模式集成的錯誤,還能在變換數(shù)據(jù)時起到一定的作用。***數(shù)據(jù)預(yù)處理第八章數(shù)據(jù)挖掘of3114***數(shù)據(jù)集成2.冗余和相關(guān)分析數(shù)據(jù)集成往往導(dǎo)致數(shù)據(jù)冗余,分析冗余有很多種方法。首先,可以將數(shù)據(jù)進(jìn)行可視化處理,將數(shù)據(jù)點繪制成圖表后趨勢和關(guān)聯(lián)會變得清晰起來。除此之外,冗余還可以通過相關(guān)性分析方法檢驗。對于標(biāo)稱數(shù)據(jù),可以使用卡方檢驗;對于數(shù)值屬性,可以用相關(guān)系數(shù)度量一個屬性在多大程度上蘊(yùn)含另一個屬性,通過相關(guān)性分析來刪除冗余數(shù)據(jù)。3.數(shù)值沖突的檢測與處理對于現(xiàn)實世界的同一實體,由于表達(dá)方式、尺度標(biāo)準(zhǔn)或編碼的不同常導(dǎo)致元數(shù)據(jù)的巨大差異。例如,在大學(xué)的課程評分系統(tǒng)中,有的學(xué)校采用A+~F對成績進(jìn)行評分,而有的則采用數(shù)值1~100評分。于是在對這兩所學(xué)校進(jìn)行數(shù)據(jù)庫合并時,應(yīng)該將兩個系統(tǒng)的評分制度做統(tǒng)一處理,以便進(jìn)行進(jìn)一步的數(shù)據(jù)挖掘。***數(shù)據(jù)預(yù)處理第八章數(shù)據(jù)挖掘of3115***數(shù)據(jù)交換在進(jìn)行數(shù)據(jù)挖掘前,須對數(shù)據(jù)集進(jìn)行相應(yīng)的數(shù)據(jù)變換。常用的變換策略如下。1.數(shù)據(jù)規(guī)范化數(shù)據(jù)規(guī)范化的目的是將數(shù)據(jù)按比例縮放,使得屬性之間的權(quán)值適合數(shù)據(jù)挖掘。例如,統(tǒng)計身高信息的度量單位是不同的,若在數(shù)據(jù)挖掘中把height屬性的度量單位從米變成英寸,則可能導(dǎo)致完全不同的結(jié)果。常見的數(shù)據(jù)規(guī)范化方法包括最小-最大規(guī)范化、z-score分?jǐn)?shù)規(guī)范化、小數(shù)定標(biāo)規(guī)范化等。2.數(shù)據(jù)離散化數(shù)據(jù)離散化是將數(shù)值屬性的原始值用區(qū)間標(biāo)簽或概念標(biāo)簽替換的過程,它可以將連續(xù)屬性值離散化。連續(xù)屬性離散化的實質(zhì)是將連續(xù)屬性值轉(zhuǎn)換成少數(shù)有限的區(qū)間,從而有效地提高數(shù)據(jù)挖掘工作的計算效率。***數(shù)據(jù)預(yù)處理第八章數(shù)據(jù)挖掘of3116***數(shù)據(jù)交換3.概念分層概念分層的主要思想是將低層概念的集合映射到高層概念的集合,它廣泛應(yīng)用于標(biāo)稱數(shù)據(jù)的轉(zhuǎn)換。如現(xiàn)有某個數(shù)據(jù)庫需要對關(guān)于地理位置location的屬性集進(jìn)行概念分層,其中屬性內(nèi)容包括街道street、國家country、城市city和省份province_or_state。首先,對每個屬性不同值的個數(shù)進(jìn)行統(tǒng)計分析,并將其按照升序進(jìn)行排列。其次,根據(jù)排列好的屬性順序,自頂向下進(jìn)行分層。根據(jù)大家的常規(guī)認(rèn)識,對屬性的全序排列結(jié)果為街道street<城市city<省份province_or_state<國家country,即街道street屬性在最頂層,國家country屬性在最底層。最后,用戶根據(jù)產(chǎn)生的分層,選擇合適的屬性代替該屬性集。***數(shù)據(jù)預(yù)處理第八章數(shù)據(jù)挖掘of3117***Python數(shù)據(jù)預(yù)處理下面結(jié)合kaggle比賽HousePrices來介紹數(shù)據(jù)預(yù)處理。1.加載數(shù)據(jù)houseprice=pd.read_csv('../input/train.csv')#加載后放入DataFrame里all_data=pd.read_csv('train.csv',header=0,parse_dates=['time'],usecols=['time','LotArea','price'])#可選擇加載哪幾列houseprice.head()#顯示前5行數(shù)據(jù)()#查看各字段信息houseprice.shape#查看數(shù)據(jù)集行列分布houseprice.describe()#查看數(shù)據(jù)大體情況,可獲得某一列的基本統(tǒng)計特征***數(shù)據(jù)預(yù)處理第八章數(shù)據(jù)挖掘of3118***Python數(shù)據(jù)預(yù)處理2.分析缺失數(shù)據(jù)houseprice.isnull()#元素級別的判斷,把對應(yīng)的所有元素的位置都列出來,元素為空值或NA就顯示True;否則,顯示Falsehouseprice.isnull().any()#列級別的判斷,只要該列有為空值或NA的元素,就為True;否則,為Falsemissing=houseprice.columns[houseprice.isnull().any()].tolist()#將為空值或NA的列找出來houseprice[missing].isnull().sum()

#將列中為空值或NA的元素個數(shù)統(tǒng)計出來#將某一列中缺失元素的值,用value值進(jìn)行填補(bǔ)。處理缺失數(shù)據(jù)時,如該列都是字符串,不是數(shù)值,則可以用出現(xiàn)次數(shù)最多的字符串來填補(bǔ)缺失值defcat_imputation(column,value):

houseprice.loc[houseprice[column].isnull(),column]=valuehouseprice[['LotFrontage','Alley']][houseprice['Alley'].isnull()==True]#從LotFrontage和Alley列中選擇行,選擇Alley中數(shù)據(jù)為空值的行。主要用來看兩個列的關(guān)聯(lián)程度,看它們是不是大多同時為空值。houseprice['Fireplaces'][houseprice['FireplaceQu'].isnull()==True].describe()#對篩選出來的數(shù)據(jù)進(jìn)行描述,比如一共多少行、均值、方差、最小值、最大值,等等***數(shù)據(jù)預(yù)處理第八章數(shù)據(jù)挖掘of3119***Python數(shù)據(jù)預(yù)處理3.統(tǒng)計分析houseprice['MSSubClass'].value_counts()#統(tǒng)計某一列中各個元素值出現(xiàn)的次數(shù)print("Skewness:%f"%houseprice['MSSubClass'].skew())#列出數(shù)據(jù)的偏斜度print("Kurtosis:%f"%houseprice['MSSubClass'].kurt())#列出數(shù)據(jù)的峰度houseprice['LotFrontage'].corr(houseprice['LotArea'])#計算兩個列的相關(guān)度houseprice['SqrtLotArea']=np.sqrt(houseprice['LotArea'])#將列的數(shù)值求根,并賦予一個新列houseprice[['MSSubClass','LotFrontage']].groupby(['MSSubClass'],as_index=False).mean()#對MSSubClass進(jìn)行分組,并求分組后的平均值***數(shù)據(jù)預(yù)處理第八章數(shù)據(jù)挖掘of3120***Python數(shù)據(jù)預(yù)處理4.數(shù)據(jù)處理1)刪除相關(guān)delhouseprice['SqrtLotArea']#刪除列houseprice['LotFrontage'].dropna()#去掉為空值或NA的元素houseprice.drop(['Alley'],axis=1)#去掉Alley列,不管空值與否df.drop(df.columns[[0,1]],axis=1,inplace=True)#刪除第1、2列,inplace=True表示直接在內(nèi)存中替換,不用二次賦值生效houseprice.dropna(axis=0)#刪除有空值的行houseprice.dropna(axis=1)#刪除有空值的列2)缺失值填補(bǔ)處理houseprice['LotFrontage']=houseprice['LotFrontage'].fillna(0)#將該列中的空值或NA填補(bǔ)為0all_duct_type[all_duct_type.isnull()]=all_duct_type.dropna().mode().values

#如果該列是字符串,就將該列中出現(xiàn)次數(shù)最多的字符串賦予空值,mode()函數(shù)是取出現(xiàn)次數(shù)最多的元素houseprice['LotFrontage'].fillna(method='pad')

#使用前一個數(shù)值替代空值或NA,就是用NA前面最近的非空數(shù)值替換houseprice['LotFrontage'].fillna(method='bfill',limit=1)

#使用后一個數(shù)值替代空值或NA,limit=1是限制如果有幾個連續(xù)的空值,只有最近的一個空值可以被填補(bǔ)houseprice['LotFrontage'].fillna(houseprice['LotFrontage'].mean())#使用平均值進(jìn)行填補(bǔ)houseprice['LotFrontage'].interpolate()#使用插值來估計NaN。如果index是數(shù)字,可以設(shè)置參數(shù)method='value';如果是時間,可以設(shè)置method='time'houseprice=houseprice.fillna(houseprice.mean())#將缺失值全部用該列的平均值代替,此時一般已經(jīng)提前將字符串特征轉(zhuǎn)換成了數(shù)值注意:如果在處理缺失數(shù)據(jù)時,數(shù)據(jù)缺失比例達(dá)到15%,并且該變量作用不大,那么就刪除該變量!***數(shù)據(jù)預(yù)處理第八章數(shù)據(jù)挖掘of3121***Python數(shù)據(jù)預(yù)處理4.數(shù)據(jù)處理3)字符串替換houseprice['MSZoning']=houseprice['MSZoning'].map({'RL':1,'RM':2,'RR':3,}).astype(int)#將MSZoning中的字符串變成對應(yīng)的數(shù)字4)數(shù)據(jù)連接merge_data=pd.concat([new_train,df_test])#將訓(xùn)練數(shù)據(jù)與測試數(shù)據(jù)連接起來,以便一起進(jìn)行數(shù)據(jù)清洗all_data=pd.concat((train.loc[:,'MSSubClass':'SaleCondition'],test.loc[:,'MSSubClass':'SaleCondition']))#另一種合并方式,按列名字進(jìn)行合并res=pd.merge(df1,df2,on=['time'])#將df1、df2按照time字段進(jìn)行合并5)數(shù)據(jù)保存merge_data.to_csv('merge_data.csv',index=False)#index=False,寫入的時候不寫入列的索引序號6)數(shù)據(jù)轉(zhuǎn)換houseprice["Alley"]=np.log1p(houseprice["Alley"])#采用log(1+x)方式對原數(shù)據(jù)進(jìn)行處理,改變原數(shù)據(jù)的偏斜度,使數(shù)據(jù)更加符合正態(tài)分布曲線numeric_feats=houseprice.dtypes[houseprice.dtypes!="object"].index#把內(nèi)容為數(shù)值的特征列找出來7)數(shù)據(jù)標(biāo)準(zhǔn)化Scikit-Learn庫為其提供了相應(yīng)的函數(shù):from

sklearn

import

preprocessingnormalized_X

=

preprocessing.normalize(X)

#normalizethedataattributesstandardized_X

=

preprocessing.scale(X)

#standardizethedataattributes8.1

Python常用數(shù)據(jù)分析工具8.2

數(shù)據(jù)預(yù)處理8.3分類與預(yù)測8.5實戰(zhàn):信用評估習(xí)題8.4

聚類分析of5622高級大數(shù)據(jù)人才培養(yǎng)叢書8.6實戰(zhàn):影片推薦系統(tǒng)第八章數(shù)據(jù)挖掘***分類與預(yù)測第八章數(shù)據(jù)挖掘of3123***特征選擇分類(Classification)和預(yù)測(Prediction)是預(yù)測問題的兩種主要類型。分類主要是預(yù)測分類標(biāo)號(離散屬性),而預(yù)測主要是建立連續(xù)值函數(shù)模型。預(yù)測可給定自變量對應(yīng)的因變量的值。特征選擇的一般過程如圖所示:首先從原始特征集中根據(jù)一定的策略產(chǎn)生特征子集,對特征子集進(jìn)行評估,得到相應(yīng)的評估值,然后將評估值和設(shè)定的閾值比較,如果評估值低于閾值,則重新產(chǎn)生新的特征子集,進(jìn)行下一輪迭代;如果評估值高于閾值,則停止迭代,并對最優(yōu)特征子集進(jìn)行驗證。特征選擇模型主要有兩種:Filter模型和Wrapper模型。***分類與預(yù)測第八章數(shù)據(jù)挖掘of3124***性能評估對于分類問題,為了評估算法的性能,通常要將數(shù)據(jù)集分為訓(xùn)練集和測試集兩類:訓(xùn)練集用來訓(xùn)練分類模型,測試集用來測試分類模型的性能。將一個訓(xùn)練集劃分為訓(xùn)練集和測試集的常見方法:留出法、交叉驗證法和自助法。留出法:將數(shù)據(jù)集分為2個互斥的集合,分別為訓(xùn)練集和測試集。在劃分的時候需要注意,訓(xùn)練集和測試集的數(shù)據(jù)分布要基本一致,避免劃分?jǐn)?shù)據(jù)集過程中的偏差影響模型的訓(xùn)練和測試。交叉驗證法:將數(shù)據(jù)集分為k份互斥子集,通過分層采樣保證數(shù)據(jù)分布的一致性。每次將k-1份子集的合集作為訓(xùn)練集,剩下的一份作為測試集,總共進(jìn)行k次實驗,結(jié)果取平均值。這兩種方法都使得訓(xùn)練樣本數(shù)少于實際數(shù)據(jù)集中的樣本數(shù),而自助法可解決這一問題。自助法:對于有m個樣本的數(shù)據(jù)集,每次通過有放回的方式從原始數(shù)據(jù)集中抽取m次,這樣生成的訓(xùn)練集和測試集都是和原始數(shù)據(jù)集規(guī)模一致的。自助法的缺點是改變了原始數(shù)據(jù)集的分布。***分類與預(yù)測第八章數(shù)據(jù)挖掘of3125***性能評估對于算法的性能評估除了需要測試集,還需要算法性能評估指標(biāo)。對于不同的任務(wù),采用不同的算法性能評估指標(biāo)來比較不同算法或同一算法不同參數(shù)的效果。對于二分類問題,可以將分類算法預(yù)測的類別和樣本的實際類別組合,得到分類結(jié)果的混淆矩陣,如下表所示。預(yù)測結(jié)果實際情況正例反例正例TP(真正例)FN(假反例)反例FP(假正例)TN(真反例)其中:

TP表示分類算法預(yù)測為正例且實際也是正例的樣本數(shù)量,稱為真正例;

FP表示分類算法預(yù)測為正例但實際是反例的樣本數(shù)量,稱為假正例;

FN表示分類算法預(yù)測為反例但實際是正例的樣本數(shù)量,稱為假反例;

TN表示分類算法預(yù)測為反例且實際也是反例的樣本數(shù)量,稱為真反例。***分類與預(yù)測第八章數(shù)據(jù)挖掘of3126***性能評估主要的評估指標(biāo):

1)準(zhǔn)確率(accuration)準(zhǔn)確率是指分類正確的樣本數(shù)占總樣本數(shù)的比例。定義為:

(8-1)2)精確率(precision)精確率是指預(yù)測正確的正樣本數(shù)占總的預(yù)測為正樣本數(shù)的比例。定義為:

(8-2)3)召回率(recall)召回率是指預(yù)測正確的正樣本數(shù)占總的正樣本數(shù)的比例。定義為:

(8-3)4)F1值

F1值是在精確率和召回率的基礎(chǔ)上提出的,定義為:

(8-4)

對于一個分類問題,預(yù)測的精確率和召回率通常是相互制約的,精確率高一般召回率低,召回率高一般精確率低,F(xiàn)1值很好地平衡了這兩個指標(biāo)的影響。***分類與預(yù)測第八章數(shù)據(jù)挖掘of3127***性能評估主要的評估指標(biāo):

5)ROC和AUC分類算法得到的結(jié)果一般是一個實值,然后通過將這個值與設(shè)定的閾值比較大小來判定這個樣本屬于正例或反例。值越大,說明這個樣本屬于正樣本的概率越大;值越小,說明這個樣本屬于負(fù)樣本的概率越大。實際應(yīng)用中,如果更看重精確率,則可以提高閾值;如果更看重召回率,則可以降低閾值。ROC曲線全稱為“受試者工作特征”(ReceiverOperatingCharacteristic)曲線,體現(xiàn)不同閾值下的分類效果,即分類算法在不同需求任務(wù)下的泛化性能的好壞,如圖8-2所示。在圖8-2中,橫坐標(biāo)是假正例率(FalsePositiveRate,F(xiàn)PR),表示真實正例被預(yù)測為正例的比例,和召回率一致;縱坐標(biāo)是真正例率(TruePositiveRate,TPR),表示真實反例被預(yù)測為正例的比例。它們的定義分別為:(8-5)

(8-6)AUC是ROC下包含的面積,當(dāng)AUC大于0.5時,說明分類算法是有效的,而且AUC越大說明分類算法的泛化能力越強(qiáng);當(dāng)AUC小于或等于0.5時,說明分類算法無效。***分類與預(yù)測第八章數(shù)據(jù)挖掘of3128***實現(xiàn)過程1.分類分類是構(gòu)造一個分類模型,輸入樣本的屬性值,可以輸出對應(yīng)的類別,從而將每個樣本映射到預(yù)先定義好的類別中。分類模型建立在已知類標(biāo)記的數(shù)據(jù)集上,可以方便地計算模型在已有樣本上的準(zhǔn)確率,所以分類屬于有監(jiān)督的學(xué)習(xí)。2.預(yù)測預(yù)測是指建立兩種或兩種以上變量間相互依賴的函數(shù)模型,然后進(jìn)行預(yù)測或控制。3.實現(xiàn)過程分類和預(yù)測的實現(xiàn)過程類似,以分類模型為例。分類模型的實現(xiàn)有兩個步驟:第一步是建立一個模型(見圖8-3),可通過歸納分析訓(xùn)練樣本集來建立分類模型,得到分類規(guī)則;第二步是使用模型進(jìn)行分類(見圖8-4),用已知的測試樣本集評估分類規(guī)則的準(zhǔn)確率,如果準(zhǔn)確率是可以接受的,則使用該模型對未知類標(biāo)記的待測樣本集進(jìn)行預(yù)測。***分類與預(yù)測第八章數(shù)據(jù)挖掘of3129***實現(xiàn)過程3.實現(xiàn)過程

預(yù)測模型的實現(xiàn)也有兩個步驟,類似于分類,首先通過訓(xùn)練集建立預(yù)測屬性(數(shù)值型的)的函數(shù)模型,然后在模型通過檢驗后進(jìn)行預(yù)測或控制。分類(Classification)是一種重要的數(shù)據(jù)分析形式,它提取刻畫重要數(shù)據(jù)類的模型。這種模型稱為分類器,預(yù)測分類的(離散的、無序的)類標(biāo)號。這些類別可以用離散值表示,其中值之間的次序沒有意義。***分類與預(yù)測第八章數(shù)據(jù)挖掘of3130***分類與預(yù)測的常用方法1.K-最近鄰K-最近鄰(K-NearestNeighbor,KNN)算法最早是由Cover和Hart在1967年提出的,其主要思想是找到特征最相似的訓(xùn)練集,然后認(rèn)為待預(yù)測的樣本類型就是這個最近鄰樣本的類型。K-最近鄰算法的實現(xiàn)流程如下:(1)對于預(yù)測集的樣本,計算其特征向量和每個訓(xùn)練集樣本特征向量的距離。(2)按距離對訓(xùn)練樣本排序。(3)取排序靠前的前K個樣本,統(tǒng)計這些樣本中出現(xiàn)次數(shù)最多的標(biāo)簽。(4)出現(xiàn)最多的標(biāo)簽就認(rèn)為是待預(yù)測樣本的標(biāo)簽。K-最近鄰算法實現(xiàn)簡單,預(yù)測的精度一般也較高,但是對預(yù)測集的每個樣本都需要計算它和每個訓(xùn)練樣本的相似度,計算量較大,尤其是訓(xùn)練集很大的時候,計算量會嚴(yán)重影響算法的性能。***分類與預(yù)測第八章數(shù)據(jù)挖掘of3131***分類與預(yù)測的常用方法1.K-最近鄰例:先驗數(shù)據(jù)如表8-3所示,使用KNN算法對表8-4中的未知類別數(shù)據(jù)分類。1)KNN算法的Python實現(xiàn)(詳見P:214)2)KNNTest.py測試文件(詳見P:215)

***分類與預(yù)測第八章數(shù)據(jù)挖掘of3132***分類與預(yù)測的常用方法2.決策樹決策樹是一個樹狀結(jié)構(gòu),它的每一個葉節(jié)點對應(yīng)一個分類,非葉節(jié)點對應(yīng)在某個屬性上的劃分,根據(jù)樣本在該屬性上的不同取值將其劃分成若干個子集。對于非純的葉節(jié)點,多數(shù)類的標(biāo)號給出了到達(dá)這個節(jié)點的樣本所屬的類。構(gòu)造決策樹的核心問題在于每一步該如何選擇適當(dāng)?shù)膶傩詫颖咀霾鸱?。對一個分類問題,從已知類標(biāo)記的訓(xùn)練樣本中學(xué)習(xí)并構(gòu)造出決策樹是一個自上而下、分而治之的過程。決策樹的關(guān)鍵是在節(jié)點上對屬性的判別,但是一般樣本都有很多屬性,優(yōu)先選取哪些屬性顯得尤為重要。分枝時我們的目標(biāo)是盡量使分枝的節(jié)點包括的樣本都屬于同一類別。在此基礎(chǔ)上產(chǎn)生了很多有效的最優(yōu)劃分屬性判別算法,常見的有ID3決策樹、C4.5決策樹和CART決策樹等。***分類與預(yù)測第八章數(shù)據(jù)挖掘of3133***分類與預(yù)測的常用方法2.決策樹

ID3決策樹使用的判別方法是信息增益。信息熵:度量樣本集合純度的一個指標(biāo),定義為:

(8-7)信息熵越小,代表純度越高。信息增益:屬性

對于樣本D進(jìn)行劃分時獲得的增益,表示為:

(8-8)信息增益越大說明用屬性

來劃分樣本D獲得的分類效果越好。因此,信息增益可以作為優(yōu)先選擇屬性的判別標(biāo)準(zhǔn)之一。***分類與預(yù)測第八章數(shù)據(jù)挖掘of3134***分類與預(yù)測的常用方法2.決策樹信息增益有個缺點,它對可取值多的屬性的偏好較大,為此,C4.5決策樹提出以增益率作為選取最優(yōu)屬性的指標(biāo)。增益率定義為:

(8-9)

其中,

(8-10)一個固定值,這個值的特點是屬性的可取值越多,這個值越大,從而有效地避免了取值多的屬性被優(yōu)先選取的可能性。但是這會導(dǎo)致另一個問題,就是屬性取值少的屬性優(yōu)先選取的概率被放大,所以不能直接用這個指標(biāo)作為選取優(yōu)先屬性的標(biāo)準(zhǔn)。C4.5決策樹給出的是一種啟發(fā)式的方法:先找到屬性中信息增益高于平均水平的屬性,再從里面選取增益率最高的屬性。集合兩個指標(biāo)選取屬性,可使得屬性的取值對算法的影響大大減小。***分類與預(yù)測第八章數(shù)據(jù)挖掘of3135***分類與預(yù)測的常用方法2.決策樹對于CART決策樹,使用“基尼指數(shù)”選取屬性?;嶂禐?

(8-11)基尼值越小,代表集合的純度越高。基尼指數(shù)定義為:

(8-12)優(yōu)先選取基尼指數(shù)最小的屬性作為優(yōu)先屬性。決策樹的一個缺點是容易過擬合。過擬合的一個表現(xiàn)是在訓(xùn)練集上都能正確分類,但是在測試集上表現(xiàn)很差,體現(xiàn)在算法上就是分枝過多。為了克服這個缺點,決策樹引進(jìn)了剪枝的概念。剪枝分為預(yù)剪枝和后剪枝。預(yù)剪枝是在樹生成過程中,判斷節(jié)點的劃分能不能帶來算法泛化性能的提升,如果不能,這個節(jié)點就可當(dāng)作葉節(jié)點。后剪枝是樹生成后,對每個節(jié)點進(jìn)行考察,如果去掉這個節(jié)點能夠提升算法的泛化性能,那么就把這個節(jié)點設(shè)置成葉節(jié)點。***分類與預(yù)測第八章數(shù)據(jù)挖掘of3136***分類與預(yù)測的常用方法2.決策樹輸出:這樣遞歸得到的一棵以node為根節(jié)點的樹就是生成的決策樹。算法優(yōu)點:準(zhǔn)確率較高,可解釋性強(qiáng),對缺失值、異常值和數(shù)據(jù)分布不敏感等。缺點:對于連續(xù)型的變量需要離散化處理,容易出現(xiàn)過擬合現(xiàn)象等。***分類與預(yù)測第八章數(shù)據(jù)挖掘of3137***分類與預(yù)測的常用方法2.決策樹下面以表8-5中的數(shù)據(jù)為例,說明ID3決策樹算法的實現(xiàn)。***分類與預(yù)測第八章數(shù)據(jù)挖掘of3138***分類與預(yù)測的常用方法2.決策樹說明:示例Python源代碼詳見P:221-224圖形顯示決策樹的Python源代碼詳見P:225-226

c.運(yùn)行得到的決策樹如圖8-6所示。***分類與預(yù)測第八章數(shù)據(jù)挖掘of3139***分類與預(yù)測的常用方法3.樸素貝葉斯分類算法樸素貝葉斯分類算法的基礎(chǔ)是1763年英國學(xué)者提出的貝葉斯定理,貝葉斯定理的定義如下:

(8-13)(8-14)***分類與預(yù)測第八章數(shù)據(jù)挖掘of3140***分類與預(yù)測的常用方法3.樸素貝葉斯分類算法對于未知樣本

,分別計算這個樣本為每一類的條件概率,最大概率值對應(yīng)的類別就判定為樣本所屬的類別。其中,

計算比較困難,因為未知樣本的屬性在訓(xùn)練集中可能沒出現(xiàn),根據(jù)屬性間相互獨立的假設(shè)可得:

(8-15)所以樸素貝葉斯分類算法的表達(dá)式可以寫成:

(8-16)樸素貝葉斯分類算法的流程為:(1)計算每個類別出現(xiàn)的概率

。(2)計算每個獨立特征的條件概率,求和得到

。(3)計算不同類別下的

,最大值對應(yīng)的類別判斷為樣本的類別。樸素貝葉斯分類算法的優(yōu)點是計算簡單,在數(shù)據(jù)量較少的情況下依然有效,也適用于多分類的問題;缺點是屬性的相互獨立假設(shè)在實際問題中可能得不到很好地滿足。該算法在醫(yī)學(xué)、經(jīng)濟(jì)和社會領(lǐng)域都有廣泛的應(yīng)用。樸素貝葉斯分類算法的Python源代碼及運(yùn)行結(jié)果詳見P:227-229***分類與預(yù)測第八章數(shù)據(jù)挖掘of3141***分類與預(yù)測的常用方法4.支持向量機(jī)支持向量機(jī)(SVM)算法是由Cortes和Vapnik等人在1995年提出的一種機(jī)器學(xué)習(xí)算法,具有很強(qiáng)的理論基礎(chǔ),不僅可以用于分類任務(wù),同時也適合回歸任務(wù)。對于二分類問題,需要在不同類別間劃出超平面將兩個類別分開。超平面的方程描述如下:

(8-17)其中,

是超平面的法向量,代表平面的方向;

是位移,代表超平面和原點之間的距離。樣本中的點到超平面的距離為:

(8-18)如果超平面可以將正負(fù)樣本分開,那么有:

(8-19)訓(xùn)練樣本中使得式(8-19)等號成立的樣本點稱為“支持向量”,類型不同的兩個支持向量到超平面的距離和為:

(8-20)也稱為“間隔”。尋找能使間隔最大的超平面,就是在滿足式(8-19)的情況下使得R最大,即

(8-21)***分類與預(yù)測第八章數(shù)據(jù)挖掘of3142***分類與預(yù)測的常用方法4.支持向量機(jī)最大化

等價于最小化

,式(8-21)可以改寫成:

(8-22)使用拉格朗日乘子法對式(8-22)的每個約束添加拉格朗日乘子,可以得到拉格朗日方程:

(8-23)對

分別求偏導(dǎo)并令其為0可得:

(8-24)

由式(8-23)和式(8-24)可以得到式(8-22)的對偶問題:

(8-25)

***分類與預(yù)測第八章數(shù)據(jù)挖掘of3143***分類與預(yù)測的常用方法4.支持向量機(jī)求解出

后,求出和

即可得到SVM模型:

(8-26)

式(8-25)一般用SMO算法求解

值。SMO算法的基本思想是固定

以外的參數(shù),然后求

上的極值,流程為:(1)選取需要更新的

。(2)固定

以外的參數(shù),求解式(8-25)得到更新后的

。(3)執(zhí)行上面兩步直至收斂。

SVM算法有充分的理論基礎(chǔ),并且最終的決策只由少數(shù)的支持向量確定,算法的復(fù)雜度取決于支持向量的數(shù)量,而不是樣本空間的維數(shù),所以計算量不是很大,而且泛化準(zhǔn)確率較高。該算法的缺點是它對參數(shù)調(diào)節(jié)和核函數(shù)的選取比較敏感,而且在存儲和計算上占用較多的內(nèi)存和運(yùn)行時間,所以在大規(guī)模的樣本訓(xùn)練上有所不足。

***分類與預(yù)測第八章數(shù)據(jù)挖掘of3144***分類與預(yù)測的常用方法4.支持向量機(jī)SVM算法的Python實現(xiàn):(詳見P:231-235)SVM算法的分類結(jié)果如圖8-7所示。

***分類與預(yù)測第八章數(shù)據(jù)挖掘of3145***分類與預(yù)測的常用方法5.集成學(xué)習(xí)集成學(xué)習(xí)(EnsembleLearning)是通過綜合多個分類器來進(jìn)行決策的方法,基本流程如圖8-8所示。根據(jù)集成學(xué)習(xí)的生成過程,可以將其分為兩大類,一類是前后沒有依賴關(guān)系、分類器間是并行關(guān)系的方法,代表是Bagging方法;另一類是前后有強(qiáng)依賴關(guān)系、分類器間是串行關(guān)系的方法,代表是Boosting方法。***分類與預(yù)測第八章數(shù)據(jù)挖掘of3146***分類與預(yù)測的常用方法5.集成學(xué)習(xí)1)Bagging和BoostingBagging方法是1996年由Breiman提出的可以并行執(zhí)行的集成學(xué)習(xí)方法。Bagging方法的主要思想是采用有放回隨機(jī)抽樣,得到N

份同等規(guī)模的訓(xùn)練數(shù)據(jù),對于每份數(shù)據(jù)采用分類算法得到一個弱分類器,最后將這些分類器綜合起來,通過投票的方式進(jìn)行匯總,得到最終分類結(jié)果。Bagging方法對于不穩(wěn)定的算法,如決策樹和神經(jīng)網(wǎng)絡(luò)具有不錯的提升,但是對于穩(wěn)定的算法,如K-最近鄰算法可能沒有明顯的效果。

Boosting方法也是將弱分類器綜合成強(qiáng)分類器的方法,其中的代表是由Freund和Schapire于1997年提出的Adaboost方法。Boosting方法的主要思想是先由訓(xùn)練集和分類算法訓(xùn)練一個基分類器,然后對分類錯誤的樣本,通過調(diào)整樣本分布,使得下次訓(xùn)練的時候,這些樣本得到更多關(guān)注。這樣,每進(jìn)行一次迭代,分類算法的性能都可得到改進(jìn),最后累計得到一個分類效果更好的分類模型。***分類與預(yù)測第八章數(shù)據(jù)挖掘of3147***分類與預(yù)測的常用方法5.集成學(xué)習(xí)1)Bagging和BoostingBagging方法和Boosting方法都是由弱分類器組成強(qiáng)分類器,它們最大的區(qū)別是Bagging方法通過隨機(jī)抽取樣本使得訓(xùn)練集相互無關(guān),可以并行執(zhí)行,而Boosting方法需要通過上一個分類器來調(diào)整訓(xùn)練集,加大分類錯誤樣本的權(quán)重,同時訓(xùn)練集存在依賴關(guān)系,過程是串行執(zhí)行的。因此可以看出:在時間上,Bagging方法比Boosting方法有很大優(yōu)勢,但Boosting方法對錯誤樣本的處理使得其在準(zhǔn)確率上也相對有優(yōu)勢。Bagging方法中最經(jīng)典的擴(kuò)展是隨機(jī)森林算法,Boosting方法中最經(jīng)典的擴(kuò)展是GBDT算法和xgboost算法。下面著重介紹隨機(jī)森林算法。***分類與預(yù)測第八章數(shù)據(jù)挖掘of3148***分類與預(yù)測的常用方法5.集成學(xué)習(xí)2)隨機(jī)森林算法隨機(jī)森林(RandomForest)算法是由Breiman于2001年提出的,是Bagging方法的擴(kuò)展。隨機(jī)森林算法是由一群決策樹構(gòu)成的,但是與一般的Bagging方法不同的是,隨機(jī)森林算法在實現(xiàn)樣本隨機(jī)選擇的同時加入了特征的隨機(jī)選擇。具體來說,在傳統(tǒng)決策樹中,選取最優(yōu)劃分屬性是在所有屬性(假設(shè)

個)中考察的,而隨機(jī)森林算法中的每一棵決策樹,會對每個節(jié)點選取所有屬性中的

個屬性(它們是所有屬性集合的一個子集),然后在這個屬性中選擇最優(yōu)劃分屬性。

是引入隨機(jī)屬性的程度,如果,表示每次選擇的是全部屬性,這和普通的決策樹沒有區(qū)別;如果

,表示節(jié)點選擇一個屬性進(jìn)行劃分。其推薦取值是

。***分類與預(yù)測第八章數(shù)據(jù)挖掘of3149***分類與預(yù)測的常用方法5.集成學(xué)習(xí)2)隨機(jī)森林算法隨機(jī)森林算法主要是樣本的隨機(jī)采樣和屬性的隨機(jī)采樣,實現(xiàn)的流程如下:(1)確定隨機(jī)森林算法中決策樹的數(shù)目

。(2)通過有放回隨機(jī)采樣得到

個規(guī)模相同的訓(xùn)練集。(3)

,在屬性集合中每次隨機(jī)選取

個屬性得到

個屬性子集。(4)一個訓(xùn)練集對應(yīng)一個屬性子集,通過決策樹算法訓(xùn)練得到一棵決策樹,決策樹以最大限度增長,不做任何剪枝操作。(5)綜合這些決策樹得到隨機(jī)森林模型。(6)對于一個預(yù)測樣本,每棵決策樹都可以得到一個分類結(jié)果,通過投票機(jī)制可得這些決策樹分類結(jié)果中出現(xiàn)次數(shù)最多的類就是隨機(jī)森林模型的結(jié)果。隨機(jī)森林算法實現(xiàn)很簡單,計算量也不大,在現(xiàn)實問題的解決上效果提升明顯。隨機(jī)森林算法的優(yōu)點:不容易過擬合,適合數(shù)據(jù)的類型多樣,具有很好的抗噪聲能力,結(jié)果容易理解,可以并行化,算法計算速度快等。同時,隨機(jī)森林算法也有缺點:對小數(shù)據(jù)集可能效果不理想,計算比單棵決策樹慢,可能出現(xiàn)相似的樹,投票結(jié)果影響正確的決策。***分類與預(yù)測第八章數(shù)據(jù)挖掘of3150***分類與預(yù)測的常用方法

5.集成學(xué)習(xí)

2)隨機(jī)森林算法Scikit-Learn庫提供了隨機(jī)森林算法,詳見Scikit-Learn的官方文檔:***。使用Scikit-Learn自帶的iris數(shù)據(jù)集實現(xiàn)隨機(jī)森林算法的代碼如下:其運(yùn)行結(jié)果如下:fromsklearn.treeimportDecisionTreeRegressorfromsklearn.ensembleimportRandomForestRegressorimportnumpyasnpfromsklearn.datasetsimportload_irisiris=load_iris()#printiris#iris的4個屬性是:萼片寬度、萼片長度、花瓣寬度、花瓣長度,#標(biāo)簽是花的種類:setosaversicolourvirginicaprintiris['target'].shaperf=RandomForestRegressor()#這里使用了默認(rèn)的參數(shù)設(shè)置rf.fit(iris.data[:150],iris.target[:150])#進(jìn)行模型的訓(xùn)練##隨機(jī)挑選兩個預(yù)測不相同的樣本instance=iris.data[[100,109]]printinstanceprint'instance0prediction;',rf.predict(instance[0])print'instance1prediction;',rf.predict(instance[1])printiris.target[100],iris.target[109]

8.1

Python常用數(shù)據(jù)分析工具8.2

數(shù)據(jù)預(yù)處理8.3分類與預(yù)測8.5實戰(zhàn):信用評估習(xí)題8.4

聚類分析of5651高級大數(shù)據(jù)人才培養(yǎng)叢書8.6實戰(zhàn):影片推薦系統(tǒng)第八章數(shù)據(jù)挖掘***聚類分析第八章數(shù)據(jù)挖掘of3152***聚類分析定義聚類分析作為統(tǒng)計學(xué)習(xí)的一個分支和一種無指導(dǎo)的機(jī)器學(xué)習(xí)方法,已有幾十年的研究歷史。近年來,隨著數(shù)據(jù)挖掘的興起,聚類分析成為數(shù)據(jù)分析領(lǐng)域的一個研究熱點。聚類分析不僅是數(shù)據(jù)挖掘的重要有效方法,同時也是其他挖掘任務(wù)的前奏。聚類分析已經(jīng)成為數(shù)據(jù)挖掘研究領(lǐng)域一個非?;钴S的研究課題。聚類分析是指將物理或抽象對象的集合分組為由類似的對象組成的多個類的分析過程。聚類分析符合人類認(rèn)知過程,是一種重要的數(shù)據(jù)挖掘手段,屬于無監(jiān)督學(xué)習(xí)的范疇。聚類和分類的最大區(qū)別在于:聚類不需要標(biāo)簽而分類需要標(biāo)簽,即聚類和分類分別屬于無監(jiān)督和有監(jiān)督的學(xué)習(xí)范疇。***聚類分析第八章數(shù)據(jù)挖掘of3153***聚類分析評價標(biāo)準(zhǔn)常用的評價聚類分析能力的幾個標(biāo)準(zhǔn)如下:(1)可伸縮性(Scalability):處理大量數(shù)據(jù)的能力。許多聚類分析方法在小于1000個數(shù)據(jù)對象的小數(shù)據(jù)集上工作得很好,但是隨著數(shù)據(jù)對象的增加,這些聚類分析方法的處理能力就會下降。因此,一個好的聚類分析方法需要能處理大量的數(shù)據(jù)集。(2)處理不同類型屬性的能力:許多聚類分析方法只能聚類數(shù)值型的數(shù)據(jù)。但是,在數(shù)據(jù)挖掘領(lǐng)域,數(shù)據(jù)類型是多樣的。聚類分析作為一種分析工具,應(yīng)該能夠?qū)Σ煌愋蛿?shù)據(jù)進(jìn)行分析,從而提供一個普適的模型。(3)用于決定輸入?yún)?shù)的領(lǐng)域知識最少:許多聚類分析方法在聚類分析中要求用戶輸入一定的參數(shù),如希望產(chǎn)生類的數(shù)目,而且聚類分析結(jié)果對輸入?yún)?shù)十分敏感。參數(shù)通常很難確定,特別是對于包含高維對象的數(shù)據(jù)集來說,更是如此。要求用戶輸入?yún)?shù)不僅加重了用戶的負(fù)擔(dān),也使得聚類分析的質(zhì)量難以控制。(4)能夠發(fā)現(xiàn)任意形狀聚類的能力:許多聚類分析方法采用歐氏距離來決定相似度,這種度量方式趨向于發(fā)現(xiàn)球(超球)簇,而現(xiàn)實中有大量各類形狀的簇,因此需要聚類分析能夠發(fā)現(xiàn)任意形狀的簇。***聚類分析第八章數(shù)據(jù)挖掘of3154***聚類分析評價標(biāo)準(zhǔn)常用的評價聚類分析能力的幾個標(biāo)準(zhǔn)如下:(5)處理噪聲數(shù)據(jù)的能力:現(xiàn)實的數(shù)據(jù)中不可避免地存在各類噪聲,如孤立點、空缺、未知數(shù)據(jù)或錯誤數(shù)據(jù)等。這些噪聲的出現(xiàn)不應(yīng)該對聚類分析產(chǎn)生較強(qiáng)的影響。有些聚類分析方法對噪聲是敏感的,可能導(dǎo)致低質(zhì)量的聚類分析結(jié)果。(6)對于輸入數(shù)據(jù)的順序不敏感:有些聚類分析方法對于輸入數(shù)據(jù)的順序是敏感的。例如,同一個數(shù)據(jù)集,當(dāng)以不同的順序提交給同一個方法時,可能生成差別很大的聚類分析結(jié)果。(7)處理高維數(shù)據(jù)的能力:一個數(shù)據(jù)庫或數(shù)據(jù)倉庫可能包含若干維或若干屬性。許多聚類分析方法擅長處理低維的數(shù)據(jù),可能只涉及兩維到三維。但是在高維情況下,數(shù)據(jù)分布可能很稀疏,所以對這樣的數(shù)據(jù)對象進(jìn)行聚類分析是一個具有挑戰(zhàn)性的課題。(8)滿足用戶的約束條件:在現(xiàn)實世界中,可能需要在各種約束條件下進(jìn)行聚類分析。要找到既滿足特定的約束,又具有良好聚類特性的數(shù)據(jù)分組是一項具有挑戰(zhàn)性的任務(wù)。(9)聚類分析結(jié)果的可解釋性:聚類分析是為分析數(shù)據(jù)服務(wù)的,人們期望通過聚類分析從數(shù)據(jù)中抽取某種特定語義的解釋,也就是說,聚類分析的結(jié)果應(yīng)該是可解釋的、可理解的和可用的。***聚類分析第八章數(shù)據(jù)挖掘of3155***數(shù)據(jù)相似度度量聚類分析最基本的問題是相似度的度量。數(shù)據(jù)本身的模式和聚類方法所采用的度量方式是否匹配,直接關(guān)系聚類分析結(jié)果的好壞。在實際問題中,遇到的數(shù)據(jù)多數(shù)不能直接用于聚類分析,而且它們可能包含不同的屬性類型。其中,數(shù)值屬性和類屬性比較常見。聚類分析依據(jù)屬性類型來選擇相似度的度量方式。

1.?dāng)?shù)值屬性的數(shù)據(jù)的相似度度量方式數(shù)值屬性的數(shù)據(jù)距離計算,幾乎都依賴數(shù)據(jù)之間的距離。給定常見的向量數(shù)據(jù),很容易求得數(shù)據(jù)之間的相似度,這里相似度即距離。經(jīng)典的數(shù)據(jù)距離度量方式有馬氏距離、明氏距離和余弦距離等。***聚類分析第八章數(shù)據(jù)挖掘of3156***數(shù)據(jù)相似度度量1.?dāng)?shù)值屬性的數(shù)據(jù)的相似度度量方式***聚類分析第八章數(shù)據(jù)挖掘of3157***數(shù)據(jù)相似度度量1.?dāng)?shù)值屬性的數(shù)據(jù)的相似度度量方式***聚類分析第八章數(shù)據(jù)挖掘of3158***數(shù)據(jù)相似度度量2.類屬性的數(shù)據(jù)相似度度量方式類屬性數(shù)據(jù)的相似度度量方式是把類屬性轉(zhuǎn)換成二進(jìn)制屬性,即屬性值是否存在用0和1表示,這樣就可以用數(shù)值屬性的處理方式來處理當(dāng)前的數(shù)據(jù)。假如類屬性數(shù)據(jù)個數(shù)比較多,轉(zhuǎn)換后很可能出現(xiàn)高維數(shù)據(jù)。***聚類分析第八章數(shù)據(jù)挖掘of3159***聚類分析的常用方法聚類分析方法的選取取決于數(shù)據(jù)的類型、聚類的目的和應(yīng)用。按照聚類分析方法主要思路的不同,聚類分析方法[15~17]可以分為劃分方法、基于層次的聚類分析方法、基于密度的聚類分析方法、基于網(wǎng)格的方法、基于模型的方法等。因篇幅所限,下面介紹常用的3種方法。1.劃分方法劃分方法的原理是把待聚類的數(shù)據(jù)對象集劃分為若干簇,一個簇就是一個聚類。在給定聚類數(shù)的情況下,劃分方法首先會初始化分組,在此基礎(chǔ)上迭代優(yōu)化初始分組,直到聚類中心不再發(fā)生變化為止,并且要求一個元素只屬于一個類,而且不能有空分組。在該方法中,其核心思想就是嘗試依據(jù)目標(biāo)函數(shù)不斷優(yōu)化前一次的結(jié)果,使得每一次優(yōu)化后的聚類方案都比上一次優(yōu),當(dāng)算法終止的臨界條件滿足時,得到最終聚類方案。常見的劃分方法有:PAM算法、CLARANS算法、k-Means算法、CLARA算法等。劃分方法的主要優(yōu)點是算法簡單、快速,但一般要求所有的數(shù)據(jù)都放入內(nèi)存,這限制了它在大規(guī)模數(shù)據(jù)上的應(yīng)用。劃分方法還要求用戶預(yù)先指定聚類的個數(shù),但在大多數(shù)實際應(yīng)用中,最終的聚類個數(shù)是未知的。另外,劃分方法只使用某一固定的原則來決定聚類,這就使得當(dāng)聚類的形狀不規(guī)則或大小差別很大時,聚類的結(jié)果不能令人滿意。***聚類分析第八章數(shù)據(jù)挖掘of3160***聚類分析的常用方法1.劃分方法k-Means算法是最流行的聚類分析方法之一。首先,它隨機(jī)地選取

個初始聚類中心,并把每個對象分配給離它最近的中心,從而得到一個初始聚類。其次,計算出當(dāng)前每個聚類的重心,作為新的聚類中心,并把每個對象重新分配到最近的中心。如果新的聚類的質(zhì)量優(yōu)于原先的聚類,則用新聚類代替原聚類。循環(huán)執(zhí)行這一過程直到聚類質(zhì)量不再提高為止。k-Means算法的中心是虛擬的,并不是數(shù)據(jù)庫中確實存在的對象。k-Medoids算法用中心對象(Medoid)代替中心(Means)。它隨機(jī)地選擇

個對象作為中心對象,把每個對象分配給離它最近的中心對象。其聚類的迭代過程就是中心對象和非中心對象的反復(fù)替換,直到目標(biāo)函數(shù)值不再有改進(jìn)為止。k-Means算法的示例Python源代碼詳見P:241-243。其運(yùn)行結(jié)果如下:聚類結(jié)果如圖8-9所示。***聚類分析第八章數(shù)據(jù)挖掘of3161***聚類分析的常用方法1.劃分方法PAM算法是最早的k-Medoids算法之一。它首先隨機(jī)地選取k個中心對象,通過分析所有兩兩可能組成的對象對,區(qū)分哪個是中心對象,哪個不是中心對象,然后選出一個比較好的中心對象,并在一輪迭代中選出最好的那些對象作為下一輪的中心對象。PAM算法對于小數(shù)據(jù)集的聚類效果比較好,但對于中等數(shù)據(jù)集和大數(shù)據(jù)集的聚類效果不佳。CLARA算法與PAM算法的不同之處是CLARA算法采用了采樣技術(shù)。它從實際數(shù)據(jù)中選出一小部分作為數(shù)據(jù)代表,并從這些樣本中用PAM算法產(chǎn)生k個中心對象。CLARA算法能處理比較大的數(shù)據(jù)集。CLARANS算法融合了PAM算法和CLARA算法的優(yōu)點,只搜索局部數(shù)據(jù),但不局限于固定的搜索空間。它可以看作圖的搜索算法,圖中每個節(jié)點代表一個解,即k個中心對象。如果兩個節(jié)點包含k-1個相同的中心對象,則稱它們是相鄰的,互為鄰居。給定訪問鄰居的最大個數(shù)及重復(fù)迭代的最大次數(shù),CLARANS算法隨機(jī)地選取k

個對象作為當(dāng)前的中心對象集,每次迭代隨機(jī)地把一個中心對象替換為非中心對象,得到一個相鄰的中心對象集。如果新的聚類的質(zhì)量優(yōu)于原先的聚類,則用新的中心對象集代替原中心對象集,否則,進(jìn)行下一次替換。如果已經(jīng)搜索了最大個數(shù)的鄰居,聚類質(zhì)量都沒有提高,則該算法得到一個局部最優(yōu)解。重新開始這一過程,又得到一組局部最優(yōu)解,取其中聚類質(zhì)量最高的解作為最終解。CLARANS算法仍然具有和其他劃分方法相同的缺點,如要求數(shù)據(jù)放入內(nèi)存、得到的只是局部最優(yōu)解、結(jié)果受初始值影響等。

***聚類分析第八章數(shù)據(jù)挖掘of3162***聚類分析的常用方法2.基于層次的聚類分析方法基于層次的聚類分析方法需要把給定的數(shù)據(jù)對象集分解為幾級,然后一步一步地完成聚類,使用遞歸的思想對待聚類數(shù)據(jù)對象集的合并或分解,最后的結(jié)果以類別樹的形式呈現(xiàn),其中,節(jié)點是數(shù)據(jù)對象的數(shù)據(jù)子集對象。基于層次的聚類分析方法有凝聚式和分裂式兩種。凝聚式方法,即自底向上的聚類分析方法,首先把待聚類的每一個數(shù)據(jù)視為一個類,其次依據(jù)規(guī)則有序地進(jìn)行合并,直到滿足終止條件為上。分裂式方法,即自頂向下的聚類分析方法,首先把全部的待聚類數(shù)據(jù)看作一個類,然后依據(jù)分裂條件有序分裂為若干個類。下面介紹凝聚式方法。凝聚式方法通過計算兩類數(shù)據(jù)點之間的相似度,對所有數(shù)據(jù)點中最為相似的兩個數(shù)據(jù)點進(jìn)行組合,并反復(fù)迭代這一過程。簡單地說,它就是通過計算每一個類別的數(shù)據(jù)點與所有數(shù)據(jù)點之間的距離來確定它們之間的相似度,距離越小,相似度越高。最后將距離最近的兩個數(shù)據(jù)點或類別進(jìn)行組合,生成聚類樹。合并過程如下:我們可以獲得一個N×N的距離矩陣X,其中,表示和

的距離,稱為數(shù)據(jù)點與數(shù)據(jù)點之間的距離。記每一個數(shù)據(jù)點為

,將距離最小的數(shù)據(jù)點進(jìn)行合并,得到一個組合數(shù)據(jù)點,記為G。***聚類分析第八章數(shù)據(jù)挖掘of3163***聚類分析的常用方法2.基于層次的聚類分析方法數(shù)據(jù)點與組合數(shù)據(jù)點之間的距離:當(dāng)計算G和

的距離時,需要計算

和G中每個點的距離。組合數(shù)據(jù)點與組合數(shù)據(jù)點之間的距離:主要有SingleLinkage、CompleteLinkage和AverageLinkage三種計算方法。1)SingleLinkage

SingleLinkage是將兩個組合數(shù)據(jù)點中距離最近的兩個數(shù)據(jù)點間的距離作為這兩個組合數(shù)據(jù)點的距離。這種方法容易受極端值的影響。兩個不相似的組合數(shù)據(jù)點可能由于其中的某個極端的數(shù)據(jù)點距離較近而組合在一起。2)CompleteLinkageCompleteLinkage與SingleLinkage相反,它將兩個組合數(shù)據(jù)點中距離最遠(yuǎn)的兩個數(shù)據(jù)點間的距離作為這兩個組合數(shù)據(jù)點的距離。CompleteLinkage的問題也與SingleLinkage相反,兩個相似的組合數(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論