您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)python中怎么實(shí)現(xiàn)抽樣分類方法,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
在實(shí)踐之前你并不知道哪種算法對(duì)你的的數(shù)據(jù)效果最好。 你需要嘗試用不同的算法去實(shí)踐, 然后知道下一步的方向。 這就是我說的算法抽查。
兩種線性算法
邏輯回歸
線性判別分析 非線性機(jī)器學(xué)習(xí)算法
K近鄰算法
樸素貝葉斯。
分類和回歸樹 - CART 是決策樹的一種
支持向量機(jī)
有個(gè)問題, 什么叫線性, 什么叫非線性?
其實(shí)一般的書里面, 并不是這么分類的。 這里可能為了突出線性的重要性。 算法分為線性和非線性。 線性呢, 比如邏輯回歸, LDA。
名字里是回歸, 其實(shí)是一種分類方法。
邏輯回歸是一般的線性回歸加了一個(gè)sigmoid函數(shù), 于是取值從整個(gè)實(shí)數(shù)域到了-1 到 +1, 于是二分類就很容易理解了, 大于零一種, 小于零一種。
邏輯回歸要求
假設(shè)高斯分布
數(shù)字的輸入變量
二分類問題:
如果有時(shí)間, 應(yīng)該把重要的機(jī)器學(xué)習(xí)方法再回顧一遍。 主要思想, 實(shí)例。 后面可以搞個(gè)單獨(dú)的系列
# Logistic Regression Classification from pandas import read_csv from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.linear_model import LogisticRegression filename = 'pima-indians-diabetes.data.csv' names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = read_csv(filename, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] num_folds = 10 kfold = KFold(n_splits=10, random_state=7) model = LogisticRegression() results = cross_val_score(model, X, Y, cv=kfold) print(results.mean()) # 0.76951469583
LDA 是一種統(tǒng)計(jì)技術(shù)對(duì)于二分類和多分類問題。
它也假設(shè)參數(shù)是高斯分布
# LDA Classification from pandas import read_csv from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.discriminant_analysis import LinearDiscriminantAnalysis filename = 'pima-indians-diabetes.data.csv' names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = read_csv(filename, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] num_folds = 10 kfold = KFold(n_splits=10, random_state=7) model = LinearDiscriminantAnalysis() results = cross_val_score(model, X, Y, cv=kfold) print(results.mean()) # 0.773462064252
可以看到其實(shí)scikit learn 給我們做了很多的封裝, 調(diào)用過程都是一樣的, 沒有難度。 最簡(jiǎn)單的就可以調(diào)用然后看效果。
k比鄰 是一種基于距離的度量。 找到k個(gè)最近的樣本對(duì)一個(gè)新的樣本, 然后取得平均值作為預(yù)測(cè)值。 這里k 的取得就可能有不同的效果。
如下
# KNN Classification from pandas import read_csv from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.neighbors import KNeighborsClassifier filename = 'pima-indians-diabetes.data.csv' names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = read_csv(filename, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] num_folds = 10 kfold = KFold(n_splits=10, random_state=7) model = KNeighborsClassifier() results = cross_val_score(model, X, Y, cv=kfold) print(results.mean()) # 0.726555023923
首先 1) 沒有說明k 是多少, 應(yīng)該有一個(gè)默認(rèn)值, 找api應(yīng)該可以看到。 2) k比鄰應(yīng)該是很耗時(shí)的, 但是今天的實(shí)踐沒有反應(yīng), 原因應(yīng)該是樣本過少。
樸素貝葉斯是基于貝葉斯理論的一種算法。 它有一個(gè)重要的假設(shè), 就是每個(gè)變量是獨(dú)立分布的, 就是沒有關(guān)聯(lián)。 樸素貝葉斯計(jì)算每種參數(shù)的可能性以及每個(gè)類別的條件概率, 然后來(lái)估計(jì)新的數(shù)據(jù)并綜合計(jì)算。 這樣得到了新樣本的估計(jì)。
假設(shè)也是高斯分布, 就可以用高斯分布的密度函數(shù)
突然想到, 在實(shí)踐中, 是可以PCA 來(lái)得到彼此正交的參數(shù), 然后來(lái)用樸素貝葉斯是否效果更好??
# Gaussian Naive Bayes Classification from pandas import read_csv from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.naive_bayes import GaussianNB filename = 'pima-indians-diabetes.data.csv' names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = read_csv(filename, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] kfold = KFold(n_splits=10, random_state=7) model = GaussianNB() results = cross_val_score(model, X, Y, cv=kfold) print(results.mean()) # 0.75517771702
決策樹有幾種, 比如 CART, C4.5 決策樹呢基本的想法是遍歷所有特征, 對(duì)第一個(gè)特征做分類, 然后在每個(gè)分支根據(jù)第二個(gè)分類, 繼續(xù)。 知道所有的樣本分類相同, 或者特征用完了。
這里有個(gè)問題, 如何選擇第一個(gè)分類,有g(shù)ini法, 最大熵等幾種辦法,選擇合適的特征順序, 構(gòu)建的決策樹效率更高。
它的缺點(diǎn), 然后對(duì)于離異點(diǎn)會(huì)非常敏感, 這個(gè)要小心。
當(dāng)然, 后期的隨機(jī)森林, 以及boosting 等做法很多基于決策樹來(lái)做, 而且起到了很好的分類效果, 這是后話。
# CART Classification from pandas import read_csv from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.tree import DecisionTreeClassifier filename = 'pima-indians-diabetes.data.csv' names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = read_csv(filename, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] kfold = KFold(n_splits=10, random_state=7) model = DecisionTreeClassifier() results = cross_val_score(model, X, Y, cv=kfold) print(results.mean()) # 0.697795625427
支撐向量機(jī), 我感覺這是基本機(jī)器學(xué)習(xí)算法中最復(fù)雜的一個(gè)。
它的主要思想呢, 就是找到一個(gè)切平面可以來(lái)區(qū)分不同的類別。 - 其實(shí)就是二分類。
那么問題來(lái)了, 如果平面不能分開呢, 可以引申到多個(gè)維度
還有維度如果過高呢, 這里就是核函數(shù)的用武之地了。 它可以來(lái)解決維度過高的問題, 過高的維度, 甚至無(wú)限維對(duì)計(jì)算是不利的。
在上面這個(gè)思想下, SVM 是為了找到距離兩邊的樣本最遠(yuǎn)的線, 或者平面。
對(duì)于奇異點(diǎn), 它又增加了一個(gè)c, 作為容錯(cuò)。
對(duì)于SVM, 基本思路可能不復(fù)雜, 但是推導(dǎo)過程還是不簡(jiǎn)單的。 詳情見jly的博客, 當(dāng)然它是基于幾個(gè)牛人的理解。 后面有機(jī)會(huì)也可以寫以下。
然后對(duì)于實(shí)踐而言, 有幾個(gè)點(diǎn)
核函數(shù)的選擇。 高斯, 還是別的
幾個(gè)參數(shù)的調(diào)優(yōu)。 這個(gè)后面也應(yīng)該又討論。
# SVM Classification from pandas import read_csv from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.svm import SVC filename = 'pima-indians-diabetes.data.csv' names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = read_csv(filename, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] kfold = KFold(n_splits=10, random_state=7) model = SVC() results = cross_val_score(model, X, Y, cv=kfold) print(results.mean()) ## 0.651025290499
本章學(xué)習(xí)如何用幾種分類算法做抽樣。 下一章是關(guān)于回歸的。
這個(gè)很容易理解, 拿出來(lái)結(jié)果比較以下即可。 看代碼
# Compare Algorithms from pandas import read_csv from matplotlib import pyplot from sklearn.model_selection import KFold from sklearn.model_selection import cross_val_score from sklearn.linear_model import LogisticRegression from sklearn.tree import DecisionTreeClassifier from sklearn.neighbors import KNeighborsClassifier from sklearn.discriminant_analysis import LinearDiscriminantAnalysis from sklearn.naive_bayes import GaussianNB from sklearn.svm import SVC # load dataset filename = 'pima-indians-diabetes.data.csv' names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class'] dataframe = read_csv(filename, names=names) array = dataframe.values X = array[:,0:8] Y = array[:,8] # prepare models models = [] models.append(('LR', LogisticRegression())) models.append(('LDA', LinearDiscriminantAnalysis())) models.append(('KNN', KNeighborsClassifier())) models.append(('CART', DecisionTreeClassifier())) models.append(('NB', GaussianNB())) models.append(('SVM', SVC())) # evaluate each model in turn results = [] names = [] scoring = 'accuracy' for name, model in models: kfold = KFold(n_splits=10, random_state=7) cv_results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring) results.append(cv_results) names.append(name) msg = "%s: %f (%f)" % (name, cv_results.mean(), cv_results.std()) print(msg) # boxplot algorithm comparison fig = pyplot.figure() fig.suptitle('Algorithm Comparison') ax = fig.add_subplot(111) pyplot.boxplot(results) ax.set_xticklabels(names) pyplot.show()
result
LR: 0.769515 (0.048411) LDA: 0.773462 (0.051592) KNN: 0.726555 (0.061821) CART: 0.691302 (0.069249) NB: 0.755178 (0.042766) SVM: 0.651025 (0.072141)
上述就是小編為大家分享的python中怎么實(shí)現(xiàn)抽樣分類方法了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。