A A
[ML] Principal Component Analysis (PCA - ์ฃผ์„ฑ๋ถ„ ๋ถ„์„)

์ฃผ์„ฑ๋ถ„ ๋ถ„์„(Principal Component Analysis, PCA)์€ ๊ณ ์ฐจ์› ๋ฐ์ดํ„ฐ๋ฅผ ์ €์ฐจ์›์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ์ฃผ์š” ๋ณ€๋™์„ฑ์„ ๋ณด์กดํ•˜๋Š” ์ฐจ์› ์ถ•์†Œ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๋ฐ์ดํ„ฐ์˜ ๋ถ„์‚ฐ์„ ์ตœ๋Œ€ํ™”ํ•˜๋Š” ์ง๊ต ์ถ•์„ ์ฐพ์•„ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ์šด ์ขŒํ‘œ๊ณ„๋กœ ๋ณ€ํ™˜ํ•จ์œผ๋กœ์จ ๋…ธ์ด์ฆˆ๋ฅผ ์ค„์ด๊ณ , ์‹œ๊ฐํ™” ๋ฐ ํ•ด์„์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์„ฑ๋ถ„ ๋ถ„์„์€ ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”, ๋…ธ์ด์ฆˆ ์ œ๊ฑฐ, ๋ฐ์ดํ„ฐ ์••์ถ• ๋“ฑ์˜ ๋ชฉ์ ์œผ๋กœ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

https://yonghyuc.wordpress.com/2019/07/16/principal-component-analysis-pca/


PCA(์ฃผ์„ฑ๋ถ„ ๋ถ„์„)์˜ ํŠน์ง•

PCA์˜ ์ฃผ์š”ํ•œ ํŠน์ง•์€ ์–ด๋– ํ•œ ์ ์ด ์žˆ์„๊นŒ์š”?

1. ๋ถ„์‚ฐ ์ตœ๋Œ€ํ™”

PCA๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ถ„์‚ฐ์„ ์ตœ๋Œ€ํ™”ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ƒˆ๋กœ์šด ์ถ•์„ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋งŽ์€ ๋ณ€๋™์„ฑ์„ ์„ค๋ช…ํ•˜๋Š” ์ฃผ์„ฑ๋ถ„์„ ์ฐพ๋Š”๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

2. ์ง๊ต ์ถ•

์ฃผ์„ฑ๋ถ„์€ ์„œ๋กœ ์ง๊ต(orthogonal)ํ•˜๋Š” ์ถ•์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ์ฃผ์„ฑ๋ถ„ ๊ฐ„์˜ ์ƒ๊ด€๊ด€๊ณ„๊ฐ€ ์—†์œผ๋ฉฐ, ๊ฐ ์ฃผ์„ฑ๋ถ„์ด ๊ณ ์œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

3. ์ˆœ์„œ ์ค‘์š”

์ฒซ ๋ฒˆ์งธ ์ฃผ์„ฑ๋ถ„์€ ๊ฐ€์žฅ ํฐ ๋ถ„์‚ฐ์„ ๊ฐ€์ง€๋ฉฐ, ๋‘ ๋ฒˆ์งธ ์ฃผ์„ฑ๋ถ„์€ ๋‹ค์Œ์œผ๋กœ ํฐ ๋ถ„์‚ฐ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ์˜ ์ฃผ์š” ๋ณ€๋™์„ ๋‹จ๊ณ„์ ์œผ๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

4. ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜

๊ณ ์œ ๋ฒกํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ์šด ์ขŒํ‘œ๊ณ„๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณ€ํ™˜๋œ ๋ฐ์ดํ„ฐ๋Š” ์ฐจ์›์ด ์ถ•์†Œ๋˜์—ˆ์ง€๋งŒ, ์›๋ž˜ ๋ฐ์ดํ„ฐ์˜ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ์ตœ๋Œ€ํ•œ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.


PCA์˜ ๊ธฐ๋ณธ ์›๋ฆฌ

PCA์˜ ๊ธฐ๋ณธ ์›๋ฆฌ๋Š” ์–ด๋– ํ•œ ๊ฒƒ๋“ค์ด ์žˆ์„๊นŒ์š”?

https://knowledge.dataiku.com/latest/ml-analytics/statistics/concept-principal-component-analysis-pca.html

๋ฐ์ดํ„ฐ ์ค‘์‹ฌํ™” (Centering the Data)

๊ฐ ๋ณ€์ˆ˜์˜ ํ‰๊ท ์„ 0์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ์ค‘์‹ฌ์„ ๋งž์ถฅ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ค‘์‹ฌํ™”๋œ ๋ฐ์ดํ„ฐ ํ–‰๋ ฌ X ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ ๊ณ„์‚ฐ (Calculating the Covariance Matrix)

์ค‘์‹ฌํ™”๋œ ๋ฐ์ดํ„ฐ์˜ ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ Σ(Sigma)๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ์€ ๋ฐ์ดํ„ฐ ๋ณ€์ˆ˜ ๊ฐ„์˜ ๋ถ„์‚ฐ๊ณผ ๊ณต๋ถ„์‚ฐ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

๊ณ ์œ ๊ฐ’ ๋ถ„ํ•ด (Eigenvalue Decomposition)

๊ณต๋ถ„์‚ฐ ํ–‰๋ ฌ Σ(Sigma)์˜ ๊ณ ์œ ๊ฐ’๊ณผ ๊ณ ์œ ๋ฒกํ„ฐ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๊ณ ์œ ๊ฐ’ λi ์™€ ๊ณ ์œ ๋ฒกํ„ฐ vi ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ, ๋ฐ์ดํ„ฐ์˜ ๋ณ€๋™์„ฑ์„ ์„ค๋ช…ํ•˜๋Š” ์ฃผ์„ฑ๋ถ„์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

์ฃผ์„ฑ๋ถ„ ์„ ํƒ (Selecting Principal Components)

๊ณ ์œ ๊ฐ’์˜ ํฌ๊ธฐ ์ˆœ์œผ๋กœ ๊ณ ์œ ๋ฒกํ„ฐ๋ฅผ ์ •๋ ฌํ•˜์—ฌ ์ฃผ์„ฑ๋ถ„์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํฐ ๊ณ ์œ ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ๊ณ ์œ ๋ฒกํ„ฐ๊ฐ€ ์ฒซ ๋ฒˆ์งธ ์ฃผ์„ฑ๋ถ„์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ดํ›„ ๊ณ ์œ ๊ฐ’ ์ˆœ์œผ๋กœ ์ฃผ์„ฑ๋ถ„์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ (Transforming the Data)

์„ ํƒ๋œ ์ฃผ์„ฑ๋ถ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ์šด ์ขŒํ‘œ๊ณ„๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€ํ™˜๋œ ๋ฐ์ดํ„ฐ ํ–‰๋ ฌ Z ๋Š” ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ๋ณด์กดํ•˜๋ฉด์„œ๋„ ์ฐจ์›์ด ์ถ•์†Œ๋œ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.

  • ์—ฌ๊ธฐ์„œ Z๋Š” ๋ณ€ํ™˜๋œ ๋ฐ์ดํ„ฐ ํ–‰๋ ฌ, V๋Š” ์„ ํƒ๋œ ๊ต์œ ๋ฒกํ„ฐ ํ–‰๋ ฌ์ž…๋‹ˆ๋‹ค.

PCA(์ฃผ์„ฑ๋ถ„ ๋ถ„์„)์˜ ์žฅ, ๋‹จ์ 

์ฃผ์„ฑ๋ถ„ ๋ถ„์„์˜ ์žฅ์ 

  1. ์ฐจ์› ์ถ•์†Œ: ๋ฐ์ดํ„ฐ์˜ ์ฐจ์›์„ ์ถ•์†Œํ•˜์—ฌ ๊ณ„์‚ฐ ๋น„์šฉ์„ ์ค„์ด๊ณ , ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ณ ์ฐจ์› ๋ฐ์ดํ„ฐ๋ฅผ 2์ฐจ์›์ด๋‚˜ 3์ฐจ์›์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‹œ๊ฐ์ ์œผ๋กœ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๋…ธ์ด์ฆˆ ์ œ๊ฑฐ: ์ฃผ์š” ์„ฑ๋ถ„์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์„ฑ๋ถ„์„ ์ œ๊ฑฐํ•จ์œผ๋กœ์จ ๋ฐ์ดํ„ฐ์˜ ๋…ธ์ด์ฆˆ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค.
  3. ๋ฐ์ดํ„ฐ ์••์ถ•: ์ค‘์š”ํ•œ ์ •๋ณด๋งŒ์„ ๋ณด์กดํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์••์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ €์žฅ ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ณ , ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ๋†’์ด๋Š” ๋ฐ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์„ฑ๋ถ„ ๋ถ„์„์˜ ๋‹จ์ 

  1. ํ•ด์„์˜ ์–ด๋ ค์›€: ๋ณ€ํ™˜๋œ ์ฃผ์„ฑ๋ถ„์ด ์›๋ž˜ ๋ณ€์ˆ˜์™€ ์–ด๋–ค ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š”์ง€ ํ•ด์„ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์„ฑ๋ถ„์ด ์ง๊ด€์ ์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ณผ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ์ถ”๊ฐ€์ ์ธ ๋ถ„์„์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์„ ํ˜•์„ฑ ๊ฐ€์ •: PCA๋Š” ์„ ํ˜• ๋ณ€ํ™˜๋งŒ์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ๋น„์„ ํ˜• ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋น„์„ ํ˜• ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ, PCA์˜ ์ ์šฉ์ด ํ•œ๊ณ„๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์ •๋ณด ์†์‹ค: ์ฐจ์›์„ ์ถ•์†Œํ•˜๋Š” ๊ณผ์ •์—์„œ ์ผ๋ถ€ ์ •๋ณด๊ฐ€ ์†์‹ค๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ์˜ ์›๋ž˜ ๊ตฌ์กฐ๋‚˜ ๊ด€๊ณ„๊ฐ€ ์ผ๋ถ€ ์™œ๊ณก๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PCA(์ฃผ์„ฑ๋ถ„ ๋ถ„์„)์˜ ๊ฐœ์„  ๋ฐฉ๋ฒ•

 

๋น„์„ ํ˜• ์ฐจ์› ์ถ•์†Œ ๊ธฐ๋ฒ•

  • PCA๋Š” ์„ ํ˜• ๋ณ€ํ™˜์— ํ•œ์ •๋˜๋ฏ€๋กœ, ๋น„์„ ํ˜• ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ์—๋Š” ๋‹ค๋ฅธ ์ฐจ์› ์ถ•์†Œ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, t-SNE๋‚˜ UMAP๊ณผ ๊ฐ™์€ ๋น„์„ ํ˜• ์ฐจ์› ์ถ•์†Œ ๊ธฐ๋ฒ•์ด ํšจ๊ณผ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ ์ฐจ์› ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

  • ๊ณ ์ฐจ์› ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ๋Š” ๋จผ์ € ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ณ€์ˆ˜ ์„ ํƒ(feature selection)์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ฐจ์›์„ ๊ฐ์†Œ์‹œํ‚จ ํ›„, PCA๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

PCA์˜ ๋ณ€ํ˜•

  • ์ปค๋„ PCA (Kernel PCA): ๋น„์„ ํ˜• ๋ณ€ํ™˜์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ๋น„์„ ํ˜• ๊ตฌ์กฐ๋ฅผ ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์›๋ž˜ PCA๋ฅผ ์ปค๋„ ํŠธ๋ฆญ๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋น„์„ ํ˜• ๊ด€๊ณ„๋ฅผ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
  • Sparse PCA: ํฌ์†Œ์„ฑ์„ ์ ์šฉํ•˜์—ฌ ์ฃผ์„ฑ๋ถ„ ํƒ์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ณ€์ˆ˜ ์„ ํƒ๊ณผ PCA๋ฅผ ๊ฒฐํ•ฉํ•œ ํ˜•ํƒœ๋กœ, ํŠน์ • ๋ณ€์ˆ˜๋“ค๋งŒ์„ ๊ฐ•์กฐํ•˜์—ฌ ์ฐจ์› ์ถ•์†Œ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

PCA(์ฃผ์„ฑ๋ถ„ ๋ถ„์„) Example Code

!kaggle datasets download -d mlg-ulb/creditcardfraud
!unzip creditcardfraud.zip

 

# ์ฃผ์„ฑ๋ถ„ ๋ถ„์„ (PCA) ์˜ˆ์ œ

# ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž„ํฌํŠธ
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
# ๋ฐ์ดํ„ฐ์…‹ ๋กœ๋“œ
data = pd.read_csv('/content/creditcard.csv')

# ํ•„์š”ํ•œ ํŠน์„ฑ ์„ ํƒ
X = data.drop(['Time', 'Class'], axis=1)
y = data['Class']
# ๋ฐ์ดํ„ฐ ํ‘œ์ค€ํ™”
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# PCA ์ ์šฉ
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

# PCA ๊ฒฐ๊ณผ ์‹œ๊ฐํ™”
plt.figure(figsize=(10, 7))
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis', alpha=0.5)
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.title('PCA of Credit Card Fraud Dataset')
plt.show()