1
2
from sklearn import datasets
from sklearn.decomposition import PCA
` PCA 함수를 활용하여 PC를 얻어냄. 아래의 경우 PC 2개를 뽑아냄.
1
2
pca = PCA ( n_components = 2 )
pca . fit ( X )
PCA(copy=True, iterated_power='auto', n_components=2, random_state=None,
svd_solver='auto', tol=0.0, whiten=False)
아래와 같이 PC score를 얻어냄. 아래의 PC score를 이용하여, 회귀분석에 활용할 수 있음.
1
2
PCscore = pca . transform ( X )
PCscore [ 0 : 5 ]
array([[-2.4608061 , -0.24553253],
[-2.53956302, -0.06169198],
[-2.71024021, 0.08277011],
[-2.56577812, 0.2534473 ],
[-2.50018456, -0.15361226]])
1
2
eigens_v = pca . components_ . transpose ()
print ( eigens_v )
[[ 0.39378459 -0.91920275]
[ 0.91920275 0.39378459]]
1
2
3
4
mX = np . matrix ( X )
for i in range ( X . shape [ 1 ]):
mX [:, i ] = mX [:, i ] - np . mean ( X [:, i ])
dfmX = pd . DataFrame ( mX )
matrix([[-2.4608061 , -0.24553253],
[-2.53956302, -0.06169198],
[-2.71024021, 0.08277011],
[-2.56577812, 0.2534473 ],
[-2.50018456, -0.15361226]])
1
2
3
4
plt . scatter ( dfmX [ 0 ], dfmX [ 1 ])
origin = [ 0 ], [ 0 ] # origin point
plt . quiver ( * origin , eigens_v [ 0 ,:], eigens_v [ 1 ,:], color = [ 'r' , 'b' ], scale = 3 )
plt . show ()
PC를 활용한 회귀분석
이번에는 모든 독립변수를 활용하여 PC를 뽑아냄.
1
2
3
X2 = iris . data
pca2 = PCA ( n_components = 4 )
pca2 . fit ( X2 )
PCA(copy=True, iterated_power='auto', n_components=4, random_state=None,
svd_solver='auto', tol=0.0, whiten=False)
1
pca2 . explained_variance_
array([ 4.19667516, 0.24062861, 0.07800042, 0.02352514])
1
PCs = pca2 . transform ( X2 )[:, 0 : 2 ]
1
2
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix
모델의 복잡성으로 인하여 기존 자료를 이용한 분석은 수렴하지 않는 모습.
1
clf = LogisticRegression ( solver = "sag" , multi_class = "multinomial" ) . fit ( X2 , y )
d:\ProgramData\Anaconda3\lib\site-packages\sklearn\linear_model\sag.py:286: ConvergenceWarning: The max_iter was reached which means the coef_ did not converge
"the coef_ did not converge", ConvergenceWarning)
PC 2개 만을 뽑아내여 분석한 경우 모델이 수렴.
1
clf2 = LogisticRegression ( solver = "sag" , multi_class = "multinomial" ) . fit ( PCs , y )
1
confusion_matrix ( y , clf2 . predict ( PCs ))
array([[50, 0, 0],
[ 0, 47, 3],
[ 0, 2, 48]])
임의로 변수 2개 만을 뽑아내여 분석한 경우 모델의 퍼포먼스가 하락함.
1
2
clf = LogisticRegression ( solver = 'sag' , max_iter = 1000 , random_state = 0 ,
multi_class = "multinomial" ) . fit ( X2 [:, 0 : 2 ], y )
1
confusion_matrix ( y , clf . predict ( X2 [:, 0 : 2 ]))
array([[50, 0, 0],
[ 0, 37, 13],
[ 0, 14, 36]])
위와 같이, 차원축소를 통하여 모델의 복잡성을 줄이는 동시에 최대한 많은 정보를 활용하여 분석할 수 있음.