全文共7366字,預計學習時長30分鐘或更長python
3算法
圖片來源:https://techdifferences.com/wp-content/uploads/2018/01/Untitled-2.jpg微信
迴歸 VS 分類網絡
爲肯定使用迴歸仍是分類模型,首先要問的問題是:dom
目標變量是一個量,一個二進制分類的機率,仍是一個標籤?學習
若是目標變量是一個量或機率,須應用迴歸模型。這意味着若是要推測量值,如高度、收入、價格和分數,使用的模型應該輸出一個連續數字。或者,若是目標變量是某一項二進制標籤的機率(判斷好壞的機率除外),那麼也應該選擇迴歸模型,只是具體使用的模型略有不一樣。咱們用均方差(MSE或其它偏差)和均方根偏差(RMSE或標準差)來評估此類模型,以量化模型中的偏差。測試
若是目標變量是一個標籤,則應該使用分類模型。分類有助於預測觀察標籤(好中差等標籤除外)。棘手之處在於判斷目標變量是否爲標籤。比方說,若是目標變量是一個順序變量,表示1至5之間的不一樣等級,那麼它們即爲標籤,但其同時具備數學意義。this
這意味着數據的平均值和誤差仍有意義,但若要進行推測,應用分類模型是更爲明智的選擇。咱們經過F分數或精確度來評估這些模型,而非其偏差或標準差。下面的譜系能夠幫助咱們理解有多少觀察被正確標註,而經過混淆矩陣,這些觀察獲得視覺化呈現。矩陣中,觀察被分爲真陽性/真陰性/假陽性/假陰性。google
混淆矩陣編碼
運行模型作出預測以前,理解目標變量的特徵尤其重要。若應該使用分類模型卻誤用了迴歸模型,會得出一堆連續的預測,而非離散標籤。而由於大多數(或所有)預測並不是你想得出的1或0值,會致使推測出一個較低的F分數(也可能爲0)。若是使用得出機率的邏輯模型,有一個方法是設定一個邊界值。好比,假定任何大於0.9的值即爲1,任何小於0.9的值爲0,你仍然會得出一個F分數和混淆矩陣。但使用合適的模型一般能夠避免這項額外的步驟。
一旦決定了要使用的方法,接下來就要選擇模型進行預測。
視覺化呈現:迴歸模型 vs. 分類模型
迴歸模型
迴歸模型中使用最廣泛的是線性迴歸和邏輯迴歸。
基本的線性迴歸模型遵循這個衆所周知的等式y=mx+b,但一般實際應用中形式略有不一樣:
y=β₀+β₁x₁+…+βᵢxᵢ
該等式中,β₀表明縱軸截距,即所有解釋變量爲0值時的y值。β₁到βᵢ是x₁到xᵢ變量的相關係數,若其它變量不變,x₁到xᵢ中有一項增長或減小,則y值隨之增減。好比,在y=1+2x₁+3x₂這個等式中,若x₁由0變爲1,x₂不變,則y至由1變爲3。
邏輯模型遵循的等式略有不一樣:
y= 1 / (1+e^-(β₀+β₁x₁+…+βᵢxᵢ))
其中y值在0到1之間。所以,邏輯模型一般被用來分析二進制目標變量。此種狀況下,目標變量值爲0或1,或者目標變量是二進制變量的機率。正如前面提到,此等式防止出現非邏輯預測,得出的機率低於0或高於1。
視覺化呈現:線性迴歸 vs. 邏輯迴歸
兩種標準模型都可被調整,以更好擬合數據。主要方法是包含懲罰參數。線性和邏輯迴歸模型對應的等式均包含所有輸入的變量,而這極可能會致使過分擬合。若是數據擬合過分,模型得出預測的可靠性會下降,並侷限於訓練樣本。爲了不此種狀況的出現,能夠進行特徵選擇,挑選出相對重要的特徵;或在模型中引入懲罰參數。
視覺化呈現:低度擬合與過分擬合
引入L2懲罰項會產生嶺迴歸模型。在此模型中,相對無關變量的係數較少,以限制其影響,但仍包含全部輸入的變量。若是想無視變量的相關性並把每個變量包含進模型中,以上操做十分有效。但大多數狀況下,你會傾向於儘量簡化的模型。
引入L1懲罰項會產生拉索迴歸模型。拉索模型的機制與嶺迴歸模型類似,但會把不相關變量的係數縮減至0,徹底消除其影響。而拉索模型的不足之處在於觀察數(n)比變量數(k)多,其最多可包含n個變量。同時,拉索模型對相關變量的處理有侷限,只能隨機保留其中一個變量。
彈性網絡迴歸模型能夠解決以上全部問題,它能夠結合兩個懲罰項,更好地處理多維數據和多重共線性問題。所以,彈性網絡模型一般會比拉索模型更精確,但這取決於其所選的L1懲罰項比例,即其超參數之一。
最後還有一個問題,即嚴格意義上目標變量可能不是解釋變量的線性功能。對此,有兩個解決方法:更高層級的迴歸模型或隨機森林迴歸模型。
比方說,在最初的數據探測階段,你發現要預測收入時,年齡與收入的關聯更偏向於二次關係,而非線性關係。在這種狀況下,會對原來的線性等式中引入一個二階變量。等式就變成了這種形式:
y=β₀+β₁x+β₂x²
隨後你再次應用模型。你仍然能夠應用線性迴歸模型或更高層級的模型。
一個常見的誤解是:線性迴歸模型僅能產生線性功能。但其實,線性迴歸模型中的「線性」是指相關係數之間的關係,而非變量自己。所以,在模型中包含更高的層級或互動有助於解釋變量之間的關係。但要注意的是,若是這樣作,必須保證最終等式中包含低層級和主要影響變量,不管它們是否重要。避免出現這樣的等式:
y=β₀+β₂x² 或y=β₀+β₁x₁*x₂
咱們也可使用隨機森林迴歸模型(以下圖所示),後文將會更詳細地介紹其替代模型——應用更普遍的隨機森林分類。隨機森林迴歸的機制與邏輯迴歸類似,兩者都可得出二進制標籤的機率。簡單來講,隨機森林迴歸會產生大量決策樹。這些決策樹都會得出預測,而最終預測結果爲最廣泛的預測或平均預測。
泰坦尼克事件的隨機森林分類
如今你可能會想,難道不能用這些模型預測機率目標變量嗎?若是訓練組的y值在0到1之間,那麼模型的預測y值也在0到1之間,是吧?是,也不是。
大多數狀況下,模型預測的y值都在0到1之間。但若是模型爲線性,則低於0或高於1的機率值是非邏輯迴歸的。你能夠在模型建構中付出110%的努力,但一個觀察被分爲某一類的機率不可能達到110%。
並且,在線性模型中,診斷患病的機率分別爲10%和15%的人羣之間的不一樣就至關於診斷患病機率爲95%和1%的人羣之間的不一樣。顯然,若是某人100%患病,那麼這一點在線性模型中就不會體現,由於此數據對於低於50%的機率而言影響極小。
分類模型
若是分析是爲了構建模型以預測觀察標籤,那麼就得使用分類模型。最簡單的分類模型就是邏輯模型。然而,經過建立假目標變量並對各變量應用邏輯模型,咱們可以訓練非二進制目標變量的邏輯模型。你也能夠對此邏輯模型導入L1和L2懲罰項,從而運行拉索和嶺邏輯模型。
隨機森林分類則更有助於推測。和隨機森林迴歸同樣,隨機森林分類包含僅在特定狀況下有影響的特徵。隨機森林分類的機制同上,其採起決策樹的概念以建立一個隨機森林,並隨機選擇變量,最終基於森林得出預測。在應用模型的編碼中,能夠看到許多超參數,好比決策樹的數量、每一片樹葉上的最小觀察數、最大分裂數、決策樹的最大深度等。這些超參數有助於構建一個更爲精準的模型,但隨機森林仍有可能過分擬合。若是決策樹太大,那麼它們極可能過於具體,所以沒法應用於測試組。
視覺化呈現:隨機森林分類
最後,建立神經網絡也有助於預測觀察標籤。這是最爲複雜的方法,但相比其餘方法的確有某些優點。其主要優點在於可促成無監督學習。這意味着無需先前標記的訓練數據,該算法便可根據檢測到的類似點來聚合組別。儘管建立起來很複雜,神經網絡在預測標籤方面更爲精確,這一點對於利害關係重大的預測十分重要,如疾病診斷和詐騙檢測。
本質上,神經網絡算法的工做機制是引入一組數據,找到其中的模型和趨勢,而後作出預測(受監督)或聚合組別(無監督)。經過重複此流程並引入更大的訓練組,神經網絡算法越發精確。但要注意避免建立過多網絡層級致使訓練組過分擬合。
視覺化呈現:神經網絡
總結
選擇預測模型時,首要考慮的問題是目標變量的特徵。目標變量是持續的仍是離散的?變量是量仍是標籤?變量是機率仍是類別?變量與全部解釋變量存在線性相關性嗎?須要在預測中包含全部的變量嗎?思考這些問題的答案有助於你挑選出最佳預測模型。
源代碼及運行對比:
Regression
In [0]: import sklearn from sklearn.linear_model import ElasticNet, Lasso, Ridge, LogisticRegression, LinearRegression from sklearn.model_selection import train_test_sp lit from sklearn.metrics import mean_squared_error from sklearn.ensemble import RandomForestRegr essor import pandas as pd import matplotlib from matplotlib import pyplot def warn(*args, **kwargs): passimport warnings warnings.warn = warn
In[0] from google.colab import file suploaded = files.upload()
In [0]: data = pd.read_csv("avocado.csv") data = data.drop(['Unnamed: 0','Date', 'region','Total Volume','Total Bags'], axis = 1) data = pd.get_dummies(data, drop_first=True) y = data['AveragePrice'] X = data.drop('AveragePrice', axis=1) X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=.1)
In [250]: lm = LinearRegression() lm_fit = lm.fit(X_train, y_train)lm_predict = lm_fit.predict(X_test) #lr = LogisticRegression() #lr_fit = lr.fit(X_train,y_train) #lr_predict = lr_fit.predict(X_test) ## will not work because the range of y is 0 to 3.25, not 0 to 1 ridge = Ridge() ridge_fit = ridge.fit(X_train,y_train) r_predict = ridge_fit.predict(X_test) lasso = Lasso(max_iter=1000) lasso_fit = lasso.fit(X_train,y_train) l_predict = lasso_fit.predict(X_test) ENet = ElasticNet(l1_ratio=.01) ENet_fit = ENet.fit(X_train,y_train) en_predict = ENet_fit.predict(X_test) ## there are no higher order variables in this dataset, but for the sake of exemplifying the procedure, ## pretend there is a quadratic relationship between the number of 4225 avocados and the price data1 = data.head(500) data1['4225_sq'] = 0 for i in range(len(data1['4225'])): data1['4225_sq'][i] = (data1['4225'][i])**2 y2 = data1['AveragePrice'] X2 = data1.drop('AveragePrice', axis=1) X_train2, X_test2, y_train2, y_test2 = train_test_split(X2,y2, test_size=.1) lm_fit = lm.fit(X_train2, y_train2) ho_predict = lm_fit.predict(X_test2) rand = RandomForestRegressor() rand_fit = rand.fit(X_train,y_train) rf_predict = rand_fit.predict(X_test) /usr/local/lib/python3.6/dist- packages/sklearn/ensemble/forest.py:245: FutureWarning: The default value of n_estimators will change from 10 in version 0.20 to 100 in 0.22. "10 in version 0.20 to 100 in 0.22.", FutureWarning)
In [252]: print('Linear Model MSE:' , mean_squared_error(y_test,lm_predict)) #mean_squared_error(y_test,lr_predict) print('Ridge Model MSE:' , mean_squared_error(y_test,r_predict)) print('Lasso Model MSE:' , mean_squared_error(y_test,l_predict)) print('Elastic Net Model MSE:', mean_squared_error(y_test,en_predict)) print('Higher Order Model MSE:' , mean_squared_error(y_test2,ho_predict)) print('Random Forest MSE:' , mean_squared_error(y_test,rf_predict))
Linear Model MSE: 0.09792038897928204 Ridge Model MSE: 0.09791772364668704 Lasso Model MSE: 0.14654262570004578 Elastic Net Model MSE: 0.12919487097231586 Higher Order Model MSE: 0.015512612920132457 Random Forest MSE: 0.034497292054794515
Classification
In [0]:import sklearn from sklearn.linear_model import LogisticRegression from sklearn.ensemble import RandomForestClassifier from sklearn.neural_network import MLPClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import f1_score, confusion_matriximport pandas as pd
In [0]: from google.colab import files uploaded = files.upload()
In [0]:data = pd.read_csv("train.csv") data = data.drop(['Name','Ticket','Cabin'], axis=1) data = pd.get_dummies(data) data = data.fillna(0) y = data['Survived'] X = data.drop('Survived', axis=1) X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=.1)
In [236]: data.head()
Out[236]:
In [0]: lr = LogisticRegression() lr_fit = lr.fit(X_train,y_train) lasso2 = LogisticRegression(penalty='l1') lasso2_fit = lasso2.fit(X_train,y_train) ridge2 = LogisticRegression(penalty='l2') ridge2_fit = ridge2.fit(X_train,y_train) rand_for = RandomForestClassifier(n_estimators = 500, random_state = 40) rand_for_fit = rand_for.fit(X_train,y_train) clf = MLPClassifier(activation='logistic', solver='lbfgs',learning_rate='adaptive', alpha=.0005)clf_fit = clf.fit(X_train, y_train)
In [273]: print('Logistic F Score:',lr_fit.score(X_test, y_test)) print('LASSO F Score:',lasso2_fit.score(X_test, y_test)) print('Ridge F Score:',ridge2_fit.score(X_test, y_test)) print('Random Forest Classifier F Score:',rand_for_fit.score(X_test, y_test)) print('Neural Net F Score:',clf_fit.score(X_test, y_test))
Logistic F Score: 0.8555555555555555 LASSO F Score: 0.8555555555555555 Ridge F Score: 0.8555555555555555 Random Forest Classifier F Score: 0.8777777777777778 Neural Net F Score: 0.7333333333333333
留言 點贊 關注
咱們一塊兒分享AI學習與發展的乾貨
歡迎關注全平臺AI垂類自媒體 「讀芯術」
(添加小編微信:dxsxbb,加入讀者圈,一塊兒討論最新鮮的人工智能科技哦~)