非線性迴歸模型在資料科學中扮演著重要的角色,尤其在處理複雜的非線性關係時。多項式迴歸透過新增高次方項來捕捉曲線關係,而樣條迴歸則利用分段多項式提供更靈活的擬合方式。廣義加法模型則能自動擬合樣條,簡化建模流程。在R語言和Python中,都有成熟的套件可以實作這些技術。另一方面,分類別技術則專注於預測資料點所屬的類別。準確估計類別機率是分類別問題的核心目標,並透過設定閾值將機率轉換為最終決策。多類別問題則可以轉化為一系列二元分類別問題來處理。樸素貝葉斯演算法根據貝葉斯定理,透過假設特徵條件獨立來簡化機率計算,在實際應用中展現出良好的效能。
非線性迴歸與多項式迴歸
統計學家所指的非線性迴歸是指無法使用最小平方法進行擬合的模型。這類別模型通常涉及回應變數無法表示為預測變數或其轉換形式的線性組合。非線性迴歸模型在擬合上更具挑戰性,且需要數值最佳化,因此在可能的情況下,優先使用線性模型。
多項式迴歸
多項式迴歸涉及在迴歸方程中加入多項式項。這種方法的使用可以追溯到1815年Gergonne的論文。例如,對回應變數Y和預測變數X進行二次迴歸的方程如下:
[ Y = b_0 + b_1X + b_2X^2 + e ]
在R語言中,可以透過poly函式進行多項式迴歸。例如,以下程式碼對King County房屋資料中的SqFtTotLiving變數進行二次多項式迴歸:
lm(AdjSalePrice ~ poly(SqFtTotLiving, 2) + SqFtLot + BldgGrade + Bathrooms + Bedrooms, data=house_98105)
內容解密:
lm函式用於進行線性迴歸分析。poly(SqFtTotLiving, 2)表示對SqFtTotLiving進行二次多項式轉換。AdjSalePrice是回應變數,代表調整後的銷售價格。SqFtLot、BldgGrade、Bathrooms和Bedrooms是其他預測變數。
在Python的statsmodels中,可以透過新增平方項來實作多項式迴歸:
model_poly = smf.ols(formula='AdjSalePrice ~ SqFtTotLiving + I(SqFtTotLiving**2) + SqFtLot + Bathrooms + Bedrooms + BldgGrade', data=house_98105)
result_poly = model_poly.fit()
result_poly.summary()
內容解密:
smf.ols用於定義普通最小平方迴歸模型。I(SqFtTotLiving**2)表示新增SqFtTotLiving的平方項。result_poly.summary()輸出迴歸模型的詳細摘要。
樣條迴歸
多項式迴歸只能捕捉一定程度的非線性關係,而樣條迴歸提供了一種更靈活的方法來建模非線性關係。樣條是一種分段連續的多項式,在預測變數的一系列固定點(稱為結點)處平滑連線。
在R語言中,可以使用splines套件中的bs函式來建立b-樣條項:
library(splines)
knots <- quantile(house_98105$SqFtTotLiving, p=c(.25, .5, .75))
lm_spline <- lm(AdjSalePrice ~ bs(SqFtTotLiving, knots=knots, degree=3) + SqFtLot + Bathrooms + Bedrooms + BldgGrade, data=house_98105)
內容解密:
bs函式用於建立b-樣條基函式。knots指定了結點的位置,在此例中為SqFtTotLiving的25%、50%和75%分位數。degree=3表示使用三次樣條。
在Python中,可以使用statsmodels的公式介面來指定樣條:
formula = 'AdjSalePrice ~ bs(SqFtTotLiving, df=6, degree=3) + SqFtLot + Bathrooms + Bedrooms + BldgGrade'
model_spline = smf.ols(formula=formula, data=house_98105)
result_spline = model_spline.fit()
內容解密:
bs(SqFtTotLiving, df=6, degree=3)表示使用具有6個自由度的三次樣條。- 自由度的選擇決定了內部結點的數量和位置。
廣義加法模型
當懷疑回應變數與預測變數之間存在非線性關係時,可以使用廣義加法模型(GAM)。GAM是一種靈活的建模技術,可以自動擬合樣條迴歸。
在R語言中,可以使用mgcv套件中的gam函式:
library(mgcv)
lm_gam <- gam(AdjSalePrice ~ s(SqFtTotLiving) + SqFtLot + Bathrooms + Bedrooms + BldgGrade, data=house_98105)
內容解密:
s(SqFtTotLiving)表示對SqFtTotLiving使用平滑樣條。gam函式自動選擇最佳結點。
在Python中,可以使用pyGAM套件來實作GAM:
from pygam import LinearGAM
# 初始化並擬合模型
gam = LinearGAM().fit(data)
內容解密:
LinearGAM用於建立線性廣義加法模型。.fit(data)用於擬合模型。
分類別技術的基礎與應用
在商業決策自動化的過程中,分類別技術扮演著至關重要的角色。常見的分類別問題包括:判斷一封電子郵件是否為網路釣魚郵件、預測客戶是否會流失,或是預估網頁使用者是否會點選廣告等。這些問題都屬於監督式學習(Supervised Learning)中的分類別範疇,首先利用已知結果的資料訓練模型,再將模型應用於未知結果的資料進行預測。
分類別問題的核心目標
分類別問題最主要的目標是預測一筆資料屬於某個特定類別的機率,而非僅僅給出二元分類別結果(例如:是/否、點選/未點選、流失/未流失)。大多數演算法能夠傳回所屬類別的機率分數(傾向性),而非直接給出分類別結果。以邏輯迴歸(Logistic Regression)為例,Python 的 scikit-learn 函式庫提供了兩種預測方法:predict 用於傳回分類別結果,而 predict_proba 則傳回各類別的機率。
分類別決策流程
將機率分數轉換為最終決策的過程需要定義一個閾值(Cutoff Probability)。具體步驟如下:
- 設定閾值:為目標類別設定一個閾值機率,高於此閾值的資料被歸類別為該類別。
- 估計機率:使用任何模型預測資料屬於目標類別的機率。
- 進行分類別:若該機率高於閾值,則將資料歸類別為目標類別。
閾值的選擇直接影響模型的分類別結果。較高的閾值會減少被歸類別為目標類別的資料數量,而較低的閾值則會增加。
多類別分類別問題
大多數分類別問題涉及二元回應(Binary Response),但某些情況下,回應變數可能具有多個可能的結果。例如,在客戶合約週年時,可能出現三種結果:客戶流失(Y = 2)、轉為月結合約(Y = 1)或簽署新的長期合約(Y = 0)。此時,可以將多類別問題轉化為一系列二元分類別問題,例如:
- 預測 Y = 0 與 Y > 0:判斷客戶是否會續約。
- 在 Y > 0 的情況下,預測 Y = 1 或 Y = 2:進一步判斷客戶是選擇月結還是流失。
這種將多類別問題分解為多個二元問題的方法,在實際建模中往往更具優勢,尤其是在某個類別遠多於其他類別的情況下。
樸素貝葉斯演算法
樸素貝葉斯演算法(Naive Bayes Algorithm)利用觀察到的預測變數值在給定結果下的機率,來估計真正感興趣的內容——即在給定預測變數值的情況下,觀察到特定結果 Y = i 的機率。其數學基礎建立在貝葉斯定理之上,並假設各特徵之間相互獨立,從而簡化計算過程。
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 假設 X 為特徵資料,y 為目標變數
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 初始化樸素貝葉斯分類別器
gnb = GaussianNB()
# 訓練模型
gnb.fit(X_train, y_train)
# 進行預測
y_pred = gnb.predict(X_test)
# 評估模型準確率
accuracy = accuracy_score(y_test, y_pred)
print(f"模型準確率:{accuracy:.2f}")
程式碼解析:
- 使用
GaussianNB初始化樸素貝葉斯分類別器,適用於連續型資料。 train_test_split用於將資料集分為訓練集和測試集,便於評估模型效能。fit方法用於訓練模型,而predict方法則用於對測試集進行預測。accuracy_score用於計算模型的預測準確率,評估模型的表現。
分類別技術的未來發展
隨著機器學習技術的不斷進步,分類別技術也在不斷演化。未來的發展趨勢可能包括更複雜的模型架構、更精確的機率估計以及與其他技術(如深度學習)的結合。此外,如何在不同業務場景中選擇最合適的分類別演算法,並最佳化其效能,將是資料科學領域的重要研究方向。
簡介樸素貝葉斯分類別法中的關鍵概念
樸素貝葉斯分類別法是一種根據貝葉斯定理的機率分類別方法,廣泛應用於機器學習和資料分析。理解樸素貝葉斯分類別法的關鍵在於掌握條件機率和後驗機率的概念。
條件機率與後驗機率
- 條件機率是指在已知某事件發生的條件下,另一事件發生的機率,表示為 $P(X=i|Y=i)$。
- 後驗機率則是在納入預測變數資訊後,對結果的機率進行評估,與之相對的是未考慮預測變數資訊的先驗機率。
精確貝葉斯分類別法的侷限性
精確貝葉斯分類別法的運作原理是:
- 尋找與待分類別記錄具有相同預測變數值的其他記錄。
- 確定這些記錄所屬的類別,並找出最常見的類別。
- 將待分類別記錄歸入該類別。
然而,當預測變數數量增加時,找到完全匹配的記錄變得越來越困難。例如,在選舉投票行為預測模型中,即使樣本規模龐大,也很難找到與新記錄完全匹配的資料。因此,精確貝葉斯分類別法在實際應用中並不可行。
樸素貝葉斯的解決方案
樸素貝葉斯透過放寬精確匹配的要求來解決這個問題,其步驟如下:
- 對於二元回應變數 $Y=i$,估計每個預測變數 $X_j$ 的條件機率 $P(X_j|Y=i)$。
- 將這些條件機率相乘,並乘以所屬類別 $Y=i$ 的記錄比例。
- 對所有類別重複步驟 1 和 2。
- 透過將步驟 2 中計算的值除以所有類別的總和,估計結果 $Y=i$ 的機率。
- 將記錄歸入具有最高機率的類別。
樸素貝葉斯假設預測變數之間是條件獨立的,從而簡化了計算過程。這一假設使得計算變得可行,但也可能導致某些實際相關性的忽略。
樸素貝葉斯的數學表達
樸素貝葉斯的機率計算公式為:
$$P(Y=i|X_1, X_2, …, X_p) = \frac{P(Y=i)P(X_1|Y=i)…P(X_p|Y=i)}{P(Y=0)P(X_1|Y=0)…P(X_p|Y=0) + P(Y=1)P(X_1|Y=1)…P(X_p|Y=1)}$$
這個公式透過將聯合機率分解為個別條件機率的乘積,大大簡化了計算。
模型實作與應用
在 R 語言中,可以使用 klaR 包中的 NaiveBayes 函式來擬合樸素貝葉斯模型。例如:
library(klaR)
naive_model <- NaiveBayes(outcome ~ purpose_ + home_ + emp_len_, data = na.omit(loan_data))
內容解密:
NaiveBayes函式用於建立樸素貝葉斯模型。outcome ~ purpose_ + home_ + emp_len_指定了回應變數和預測變數。na.omit(loan_data)確保資料集中沒有缺失值。
在 Python 中,可以使用 sklearn.naive_bayes.MultinomialNB 來實作樸素貝葉斯模型。首先,需要將分類別特徵轉換為虛擬變數:
from sklearn.naive_bayes import MultinomialNB
import pandas as pd
predictors = ['purpose_', 'home_', 'emp_len_']
outcome = 'outcome'
X = pd.get_dummies(loan_data[predictors], prefix='', prefix_sep='')
y = loan_data[outcome]
naive_model = MultinomialNB(alpha=0.01, fit_prior=True)
naive_model.fit(X, y)
內容解密:
pd.get_dummies用於將分類別變數轉換為虛擬變數。MultinomialNB是用於多項式分佈資料的樸素貝葉斯分類別器。alpha=0.01是用於拉普拉斯平滑的引數,防止零機率的出現。fit_prior=True表示學習類別的先驗機率。
圖表說明:樸素貝葉斯模型結構圖
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title 迴歸與分類技術探討
package "迴歸與分類技術" {
package "非線性迴歸" {
component [多項式迴歸] as poly
component [樣條迴歸] as spline
component [GAM 模型] as gam
}
package "分類技術" {
component [機率估計] as prob
component [閾值設定] as cutoff
component [多類別處理] as multi
}
package "樸素貝葉斯" {
component [條件機率] as cond
component [後驗機率] as posterior
component [分類決策] as decision
}
}
poly --> spline : 結點分段
spline --> gam : 自動擬合
gam --> prob : 預測輸出
prob --> cutoff : 閾值轉換
cutoff --> multi : 二元分解
multi --> cond : 貝葉斯定理
cond --> posterior : P(Y|X)
posterior --> decision : 最高機率
note right of spline
迴歸技術:
- poly() 多項式
- bs() 樣條基
- s() 平滑樣條
end note
note right of cond
貝葉斯假設:
- 特徵條件獨立
- 先驗機率
- 拉普拉斯平滑
end note
@enduml此圖示展示了樸素貝葉斯模型的整體流程,從資料輸入到最終結果輸出的每個關鍵步驟。透過這個流程圖,可以清晰地理解樸素貝葉斯模型的運作方式及其在實際應用中的實施步驟。
判別分析與樸素貝葉斯分類別器在信用風險評估中的應用
在前面的章節中,我們探討瞭如何使用樸素貝葉斯分類別器來預測新貸款的違約風險。現在,我們將探討判別分析(Discriminant Analysis),這是一種早期的統計分類別方法,由R. A. Fisher在1936年提出。
樸素貝葉斯分類別器的應用
首先,讓我們回顧一下如何使用樸素貝葉斯分類別器來預測新貸款的結果。假設我們有一個包含貸款資料的資料集,我們可以使用最後一筆資料進行測試:
new_loan <- loan_data[147, c('purpose_', 'home_', 'emp_len_')]
row.names(new_loan) <- NULL
new_loan
輸出結果如下:
purpose_ home_ emp_len_
1 small_business MORTGAGE > 1 Year
內容解密:
new_loan變數儲存了用於測試的貸款資料,包含purpose_、home_和emp_len_三個變數。loan_data[147, c('purpose_', 'home_', 'emp_len_')]表示選取loan_data資料集的第147行,以及指定的三個欄位。row.names(new_loan) <- NULL用於重置new_loan的列名,使其從1開始計數。
使用樸素貝葉斯模型進行預測:
predict(naive_model, new_loan)
輸出結果如下:
$class
[1] default
Levels: paid off default
$posterior
paid off default
[1,] 0.3463013 0.6536987
內容解密:
$class表示預測的類別為default,即違約。$posterior表示後驗機率,顯示該筆貸款違約的機率為0.6536987。
在Python中,我們可以使用scikit-learn函式庫實作相同的功能:
new_loan = X.loc[146:146, :]
print('predicted class: ', naive_model.predict(new_loan)[0])
probabilities = pd.DataFrame(naive_model.predict_proba(new_loan),
columns=loan_data[outcome].cat.categories)
print('predicted probabilities', probabilities)
輸出結果如下:
predicted class: default
predicted probabilities default paid off
0 0.653696 0.346304
內容解密:
naive_model.predict(new_loan)[0]傳回預測的類別。naive_model.predict_proba(new_loan)傳回各類別的機率。
數值型預測變數的處理
樸素貝葉斯分類別器主要適用於類別型預測變數。如果要處理數值型預測變數,有兩種方法:
- 將數值型預測變數分箱(bin)並轉換為類別型變數。
- 使用機率模型(如正態分佈)來估計條件機率$P(X_j|Y=i)$。
判別分析的基本概念
判別分析是一種用於分類別的統計方法,其目標是找到一個判別函式,將不同類別的資料盡可能分開。線性判別分析(Linear Discriminant Analysis, LDA)是最常用的判別分析方法。
共變異數矩陣(Covariance Matrix)
在理解判別分析之前,我們需要了解共變異數矩陣的概念。共變異數衡量兩個變數之間的相關性,其計算公式如下:
$s_{x,z} = \frac{\sum_{i=1}^{n}(x_i - \bar{x})(z_i - \bar{z})}{n-1}$
其中,$\bar{x}$和$\bar{z}$分別是$x$和$z$的平均值,$n$是樣本數量。