Saya mencoba mencari cara untuk mereproduksi di Python beberapa pekerjaan yang telah saya lakukan di SAS. Menggunakan dataset ini , di mana multicollinearity adalah masalah, saya ingin melakukan analisis komponen utama dalam Python. Saya telah melihat scikit-learn dan statsmodels, tapi saya tidak yakin bagaimana mengambil output mereka dan mengubahnya menjadi struktur hasil yang sama dengan SAS. Untuk satu hal, SAS tampaknya melakukan PCA pada matriks korelasi ketika Anda menggunakan PROC PRINCOMP
, tetapi sebagian besar (semua?) Pustaka Python tampaknya menggunakan SVD.
Dalam dataset , kolom pertama adalah variabel respons dan 5 berikutnya adalah variabel prediktif, disebut pred1-pred5.
Di SAS, alur kerja umum adalah:
/* Get the PCs */
proc princomp data=indata out=pcdata;
var pred1 pred2 pred3 pred4 pred5;
run;
/* Standardize the response variable */
proc standard data=pcdata mean=0 std=1 out=pcdata2;
var response;
run;
/* Compare some models */
proc reg data=pcdata2;
Reg: model response = pred1 pred2 pred3 pred4 pred5 / vif;
PCa: model response = prin1-prin5 / vif;
PCfinal: model response = prin1 prin2 / vif;
run;
quit;
/* Use Proc PLS to to PCR Replacement - dropping pred5 */
/* This gets me my parameter estimates for the original data */
proc pls data=indata method=pcr nfac=2;
model response = pred1 pred2 pred3 pred4 / solution;
run;
quit;
Saya tahu bahwa langkah terakhir hanya berfungsi karena saya hanya memilih PC1 dan PC2, secara berurutan.
Jadi, dengan Python, ini adalah tentang sejauh yang saya dapat:
import pandas as pd
import numpy as np
from sklearn.decomposition.pca import PCA
source = pd.read_csv('C:/sourcedata.csv')
# Create a pandas DataFrame object
frame = pd.DataFrame(source)
# Make sure we are working with the proper data -- drop the response variable
cols = [col for col in frame.columns if col not in ['response']]
frame2 = frame[cols]
pca = PCA(n_components=5)
pca.fit(frame2)
Jumlah varian yang dijelaskan masing-masing PC?
print pca.explained_variance_ratio_
Out[190]:
array([ 9.99997603e-01, 2.01265023e-06, 2.70712663e-07,
1.11512302e-07, 2.40310191e-09])
Apa ini? Vektor eigen?
print pca.components_
Out[179]:
array([[ -4.32840645e-04, -7.18123771e-04, -9.99989955e-01,
-4.40303223e-03, -2.46115129e-05],
[ 1.00991662e-01, 8.75383248e-02, -4.46418880e-03,
9.89353169e-01, 5.74291257e-02],
[ -1.04223303e-02, 9.96159390e-01, -3.28435046e-04,
-8.68305757e-02, -4.26467920e-03],
[ -7.04377522e-03, 7.60168675e-04, -2.30933755e-04,
5.85966587e-02, -9.98256573e-01],
[ -9.94807648e-01, -1.55477793e-03, -1.30274879e-05,
1.00934650e-01, 1.29430210e-02]])
Apakah ini nilai eigen?
print pca.explained_variance_
Out[180]:
array([ 8.07640319e+09, 1.62550137e+04, 2.18638986e+03,
9.00620474e+02, 1.94084664e+01])
Saya sedikit bingung tentang cara mendapatkan dari hasil Python untuk benar-benar melakukan Regresi Komponen Utama (dalam Python). Apakah ada pustaka Python yang mengisi kekosongan yang mirip dengan SAS?
Setiap tips sangat dihargai. Saya sedikit dimanjakan oleh penggunaan label pada output SAS dan saya tidak terlalu terbiasa dengan panda, numpy, scipy, atau scikit-learn.
Edit:
Jadi, sepertinya sklearn tidak akan beroperasi secara langsung pada bingkai data panda. Katakanlah saya mengonversinya menjadi array yang numpy:
npa = frame2.values
npa
Inilah yang saya dapatkan:
Out[52]:
array([[ 8.45300000e+01, 4.20730000e+02, 1.99443000e+05,
7.94000000e+02, 1.21100000e+02],
[ 2.12500000e+01, 2.73810000e+02, 4.31180000e+04,
1.69000000e+02, 6.28500000e+01],
[ 3.38200000e+01, 3.73870000e+02, 7.07290000e+04,
2.79000000e+02, 3.53600000e+01],
...,
[ 4.71400000e+01, 3.55890000e+02, 1.02597000e+05,
4.07000000e+02, 3.25200000e+01],
[ 1.40100000e+01, 3.04970000e+02, 2.56270000e+04,
9.90000000e+01, 7.32200000e+01],
[ 3.85300000e+01, 3.73230000e+02, 8.02200000e+04,
3.17000000e+02, 4.32300000e+01]])
Jika saya kemudian mengubah copy
parameter PCA sklearn untuk False,
beroperasi langsung pada array, per komentar di bawah ini.
pca = PCA(n_components=5,copy=False)
pca.fit(npa)
npa
Per output, sepertinya menggantikan semua nilai npa
alih-alih menambahkan apa pun ke array. Apa nilai-nilainya npa
sekarang? Skor komponen utama untuk larik asli?
Out[64]:
array([[ 3.91846649e+01, 5.32456568e+01, 1.03614689e+05,
4.06726542e+02, 6.59830027e+01],
[ -2.40953351e+01, -9.36743432e+01, -5.27103110e+04,
-2.18273458e+02, 7.73300268e+00],
[ -1.15253351e+01, 6.38565684e+00, -2.50993110e+04,
-1.08273458e+02, -1.97569973e+01],
...,
[ 1.79466488e+00, -1.15943432e+01, 6.76868901e+03,
1.97265416e+01, -2.25969973e+01],
[ -3.13353351e+01, -6.25143432e+01, -7.02013110e+04,
-2.88273458e+02, 1.81030027e+01],
[ -6.81533512e+00, 5.74565684e+00, -1.56083110e+04,
-7.02734584e+01, -1.18869973e+01]])
sumber
copy=False
, saya mendapatkan nilai baru. Apakah itu skor komponen utama?Jawaban:
Scikit-belajar tidak memiliki implementasi gabungan PCA dan regresi seperti misalnya paket pls di R. Tapi saya pikir orang dapat melakukan seperti di bawah ini atau memilih regresi PLS.
Scikit-pelajari PCA
Skala dan ubah data untuk mendapatkan Komponen Utama
Varians (% kumulatif) dijelaskan oleh komponen utama
Sepertinya dua komponen pertama memang menjelaskan sebagian besar varians dalam data.
CV 10 kali lipat, dengan shuffle
Lakukan satu CV untuk mendapatkan MSE untuk intersep (tidak ada komponen utama dalam regresi)
Lakukan CV untuk 5 komponen prinsip, tambahkan satu komponen ke regresi pada saat itu
Scikit-belajar regresi PLS
sumber
Ini SVD hanya dalam Python dan NumPy (tahun kemudian).
(Ini sama sekali tidak menjawab pertanyaan Anda tentang SSA / sklearn / panda, tetapi suatu hari dapat membantu pythonist .)
-> log
sumber
Coba gunakan pipa untuk menggabungkan analisis komponen utama dan regresi linier:
sumber
Jawaban saya datang terlambat hampir lima tahun dan ada kemungkinan besar Anda tidak perlu bantuan tentang melakukan PCR dengan Python lagi. Kami telah mengembangkan paket Python bernama hoggorm yang melakukan apa yang Anda butuhkan saat itu. Silakan lihat contoh PCR di sini . Ada juga paket plot komplementer bernama hoggormplot untuk visualisasi hasil yang dihitung dengan hoggorm.
sumber