SAS'ta yaptığım bazı çalışmaları Python'da nasıl çoğaltılacağını anlamaya çalışıyorum. Çoklu doğrusallığın bir sorun olduğu bu veri kümesini kullanarak Python'da temel bileşen analizi yapmak istiyorum. Scikit-learn ve istatistik modellerine baktım, ancak çıktılarını nasıl alacağımı ve SAS ile aynı sonuç yapısına nasıl dönüştüğünü bilmiyorum. Birincisi, SAS, kullandığınızda korelasyon matrisinde PCA yapıyor gibi görünüyor PROC PRINCOMP
, ancak Python kütüphanelerinin çoğunun (hepsi?) SVD kullanıyor gibi görünüyor.
Gelen veri kümesi , birinci kolon tepkisi değişkendir ve sonraki 5 pred1-pred5 olarak adlandırılan akıllı değişkenlerdir.
SAS'ta genel iş akışı:
/* 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;
Son adımın işe yaradığını biliyorum çünkü sırayla sadece PC1 ve PC2'yi seçiyorum.
Yani, Python'da, bu elde ettiğim kadarıyla ilgili:
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)
Her bir bilgisayarın açıkladığı varyans miktarı?
print pca.explained_variance_ratio_
Out[190]:
array([ 9.99997603e-01, 2.01265023e-06, 2.70712663e-07,
1.11512302e-07, 2.40310191e-09])
Bunlar nedir? Özvektörleri?
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]])
Bunlar özdeğerler mi?
print pca.explained_variance_
Out[180]:
array([ 8.07640319e+09, 1.62550137e+04, 2.18638986e+03,
9.00620474e+02, 1.94084664e+01])
Python sonuçlarından aslında temel bileşen regresyonunu gerçekleştirmeye (Python'da) nasıl ulaşacağım konusunda biraz kaybım var. Python kütüphanelerinden herhangi biri boşluğu SAS'a benzer şekilde dolduruyor mu?
Herhangi bir ipucu takdir. SAS çıktısında etiket kullanımı ile biraz şımarık ve pandalar, numpy, scipy veya scikit-öğrenmeye çok aşina değilim.
Düzenle:
Yani, sklearn doğrudan panda veri çerçevesinde çalışmaz gibi görünüyor. Diyelim ki bir numpy dizisine dönüştürüyorum:
npa = frame2.values
npa
İşte ne olsun:
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]])
Daha sonra copy
sklearn PCA parametresini değiştirirseniz, False,
aşağıdaki yorum başına doğrudan dizide çalışır.
pca = PCA(n_components=5,copy=False)
pca.fit(npa)
npa
Çıktı başına, npa
diziye herhangi bir şey eklemek yerine tüm değerleri değiştirmiş gibi görünüyor . Şu npa
anki değerler nelerdir ? Orijinal dizi için ana bileşen puanları?
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]])
copy=False
, yeni değerler alıyorum. Temel bileşen puanları bunlar mı?