機器學習 - 降維 - PCA主成分分析
機器學習中,若特徵數目過多會發生什麼事情呢??
先直接舉個例子:
假設今天冰品店想用 溫度&假日與否 來推測冰品銷售量
數據集如下,只有十個點
minT代表當日最低溫 maxT當日最高溫 avgT代表平均溫度
T1-T7則是店家安裝在店面附近的溫度感測器
df = pd.read_csv('./pca.csv')
Y = df['Sale']
X = df.drop('Sale',axis=1)def train(X,Y):
lst=[]
for i in range(10):
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.3)
regr = linear_model.LinearRegression()
regr.fit(x_train, y_train)
y_pred = regr.predict(x_test)
lst.append(mean_squared_error(y_test, y_pred))
print(np.mean(lst))
這邊簡單地把資料load進去,隨機跑個十次data,然後用mean squared當作誤差指標
train(X,Y)MSE = 338.50
Xslice = X.iloc[:,[2,10]]
train(Xslice,Y)MSE = 277.35
結果發現,把全部維度的特徵丟進去,算出來的誤差(388),會比只用兩個特徵 "avgT"和"Holiday"算出來的(277)大許多
這個數據集是我自己隨便掰的,但是現實生活中常常會遇到這種問題,大家最近都在說"大"數據,但是餵進model的資料不是多就好,還要經過工程師的篩選才能有好的訓練效果,也就是抓住所謂的關鍵特徵(Key feature)
而特徵的T1-T7就是現在製造業導入數據分析常常遇到的盲點:業主常常花大錢,買了一堆感測器,但是不清楚要分析些什麼,重複的感測數據彼此間有 Multi-Collinearity — 多元共線性,造成訓練效果的不佳
多重共線性
線性回歸模型中的解釋變量之間由於存在精確相關關係或高度相關關係。看似相互獨立的指標本質上是相同的,是可以相互代替的,但是完全共線性的情況並不多見,一般出現的是在一定程度上的共線性,即近似共線性。
這種維度太多的情形,就是所謂聽到的維度災難
如果理論上訓練樣本時無限多的,那麼維度災難不會發生,我們可以使用無限多的特徵來獲得一個完美的分類器。訓練數據越少,使用的特徵就要越少。
而這時候遇到這種維度過多,就會需要降維
降維主要有兩種方法
1. PCA主成分分析
2. T-sne
這兩者的差別主要是,PCA速度快,而且是線性降維,也就是彼此線性相關的資料很適合使用PCA降維,但是如果特徵與特徵間的關聯是非線性關係的話,用 PCA 可能會導致underfitting的情形發生,就可以改用T-sne
from sklearn import decomposition
pca = decomposition.PCA(n_components=3)
pca.fit(X)
X_pca = pca.transform(X)train(X,Y)MSE = 255.8
透過PCA降維,可以將特徵壓縮到3個,並有良好的MSE
其他舉例:
葡萄酒數據集有13個特徵值,經過PCA分析後我們只選定兩個主成分,將投影過後的數據利用邏輯斯迴歸便可分類適當,也不用擔心因使用太多特徵值維數災難造成的過度適合(Overfitting)。
8*8的手寫辨識集,展開後是64個特徵,但經過PCA降維成25個特徵,也能保持良好的分類準確率
下次遇到大量數據前,不如先試試PCA將維度降維看看吧!