카테고리 없음
머신러닝with파이썬7(1)_차원축소,
디지털랫드
2024. 3. 22. 12:15
차원축소
이번 시간에는 차원축소의 대표적인 기법인 PCA에 대해 설명드리도록 하겠습니다.
이번 시간 정리
차원축소
feature가 많을수록 데이터의 차원이 커지게 되는데, 데이터셋의 크기에 비해 feature가 많아질 경우 이를 표현하기 위한 변수가 많아져 모델의 복잡성이 증가되고 과적합 문제가 발생되기도 합니다.
이러한 문제를 해결하기 위해 차원 축소 방법이 사용되고 있습니다.
*용어: 차원이란? 데이터 포인트를 공간에 표현하기 위해 필요한 최소한의 축의 개수
PCA(Principal Component Analysis)
- 차원 축소 기법 중 대표적인 기법
- 고차원에서 저차원으로 축소하는 선형 투영 기법
- 데이터의 차원이 증가할 수록 거리가 증가하고, 오버피팅 가능성이 커짐
PCA 단계
- 데이터에서 분산이 최대인 축을 찾음 (첫번째 축)
- 첫번째 축과 직교하면서 분산이 최대인 축을 찾음 (두번째 축)
- 첫번째와 두번째 축에 직교하고, 분산이 최대인 축을 찾음 (세번째 축)
아래의 코드 실행 버튼을 눌러 실습을 진행해 보세요!
실행 완료
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/774262505.py in <module>
2 from sklearn.datasets import load_wine
3 dataset = load_wine()
----> 4 data = pd.DataFrame(dataset.data, columns=dataset.feature_names)
NameError: name 'pd' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/3290620176.py in <module>
1 # 데이터 샘플 확인
----> 2 print(data.shape)
3 data.head()
NameError: name 'data' is not defined
1. 스탠다드 스케일링
- 특성별로 데이터 스케일이 다를 경우 머신러닝 모델이 원활하게 작동하는 데 어려움을 겪을 수 있어 데이터 스케일링을 통해 데이터 값의 범위나 분포를 같게 만들어줘야 합니다.
- 스탠다드 스케일링은 데이터 스케일링의 한 종류로서 데이터가 표준 정규 분포를 갖도록 스케일링합니다. (평균 0, 분산 1로 변경하여 모든 특성들이 같은 스케일을 갖도록 한다.)
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/2387953110.py in <module>
2 from sklearn.preprocessing import StandardScaler
3 scaler = StandardScaler()
----> 4 data = scaler.fit_transform(data)
5 data[:3]
NameError: name 'data' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/4172865828.py in <module>
1 # 데이터 복사 (df변수)
----> 2 df = data.copy()
NameError: name 'data' is not defined
2. PCA
- 2차원이나 3차원으로 축소할 경우 시각화가 가능하다는 장점이 있음
실행 완료
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/1376085888.py in <module>
1 # PCA
----> 2 pca = PCA(n_components=2)
NameError: name 'PCA' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/1862473755.py in <module>
1 # PCA 변환
----> 2 df = pca.fit_transform(df)
NameError: name 'pca' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/3995653803.py in <module>
1 # 데이터 크기 확인
----> 2 df.shape
NameError: name 'df' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/1139846908.py in <module>
1 # 샘플 데이터 확인
----> 2 df[:3]
NameError: name 'df' is not defined
3. PCA(2차원) 시각화
실행 완료
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/1884457569.py in <module>
1 # 데이터 프레임 변환
----> 2 df = pd.DataFrame(df)
3 df.head()
NameError: name 'pd' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/450191486.py in <module>
1 # scatter
----> 2 plt.scatter(df.iloc[:,0], df.iloc[:,1])
NameError: name 'plt' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/2956916954.py in <module>
1 # scatter (c=target)
----> 2 plt.scatter(df.iloc[:,0], df.iloc[:,1], c=dataset.target)
NameError: name 'plt' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/186268980.py in <module>
1 # 데이터 설명(%)
----> 2 print(pca.explained_variance_ratio_)
3 print(pca.explained_variance_ratio_.sum())
NameError: name 'pca' is not defined
4. 지도 학습 (PCA 전후 비교)
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/3393375882.py in <module>
4
5 model = RandomForestClassifier(random_state=2022)
----> 6 cross_val_score(model, df, dataset.target, scoring='accuracy', cv=5).mean()
NameError: name 'df' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/4235407067.py in <module>
1 # PCA전 데이터로 머신러닝 (13)
----> 2 cross_val_score(model, data, dataset.target, scoring='accuracy', cv=5).mean()
NameError: name 'cross_val_score' is not defined
5. PCA(3차원) 시각화
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/3858260602.py in <module>
1 # 새 데이터 복사
----> 2 df = data.copy()
NameError: name 'data' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/1126926471.py in <module>
1 # pca (n_components=3)
----> 2 pca = PCA(n_components=3)
NameError: name 'PCA' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/1342899698.py in <module>
1 # pca 변환
----> 2 df = pca.fit_transform(df)
NameError: name 'pca' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/1936103672.py in <module>
1 # 데이터 프레임 변환
----> 2 df = pd.DataFrame(df)
NameError: name 'pd' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/2689179729.py in <module>
1 # 시각화 (3차원)
2 from mpl_toolkits.mplot3d import Axes3D
----> 3 fig = plt.figure()
4 ax = fig.add_subplot(111, projection='3d')
5 ax.scatter(df.iloc[:,0], df.iloc[:,1],df.iloc[:,2], c=dataset.target)
NameError: name 'plt' is not defined
6. 점진적 PCA
- 데이터 셋이 큰 경우 활용 (배치를 통해 점직전 수행)
실행 완료
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/1409703184.py in <module>
1 # 데이터 복사
----> 2 df = data.copy()
NameError: name 'data' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/213382759.py in <module>
1 # 점진적 PCA
----> 2 pca = IncrementalPCA(n_components=2, batch_size=16)
NameError: name 'IncrementalPCA' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/518178446.py in <module>
1 # 점진적 PCA 변환
----> 2 df = pca.fit_transform(df)
NameError: name 'pca' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/2436001672.py in <module>
1 # 시각화
----> 2 df = pd.DataFrame(df)
3 plt.scatter(df.iloc[:,0], df.iloc[:,1], c=dataset.target)
NameError: name 'pd' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/186268980.py in <module>
1 # 데이터 설명(%)
----> 2 print(pca.explained_variance_ratio_)
3 print(pca.explained_variance_ratio_.sum())
NameError: name 'pca' is not defined
7. 희소PCA
- 적절한 희소성을 유지 (alpha값으로 조정)
- 오버피팅 방지
실행 완료
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/1409703184.py in <module>
1 # 데이터 복사
----> 2 df = data.copy()
NameError: name 'data' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/4087249928.py in <module>
1 # 희소 PCA
----> 2 pca = SparsePCA(n_components=2, alpha=0.01)
NameError: name 'SparsePCA' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/2373475927.py in <module>
1 # 희소 PCA 변환
----> 2 df = pca.fit_transform(df)
NameError: name 'pca' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/2436001672.py in <module>
1 # 시각화
----> 2 df = pd.DataFrame(df)
3 plt.scatter(df.iloc[:,0], df.iloc[:,1], c=dataset.target)
NameError: name 'pd' is not defined
8. 커널PCA
- 비선형으로 차원축소
실행 완료
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/1409703184.py in <module>
1 # 데이터 복사
----> 2 df = data.copy()
NameError: name 'data' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/1979484427.py in <module>
1 # 커널 PCA
----> 2 pca = KernelPCA(n_components=2)
NameError: name 'KernelPCA' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/1271366472.py in <module>
1 # 커널 PCA 변환
----> 2 df = pca.fit_transform(df)
NameError: name 'pca' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/2436001672.py in <module>
1 # 시각화
----> 2 df = pd.DataFrame(df)
3 plt.scatter(df.iloc[:,0], df.iloc[:,1], c=dataset.target)
NameError: name 'pd' is not defined
9. SVD(Singular Value Decomposition) 특이값 분해
- 행렬을 특정한 구조로 분해하는 방식
- 신호 처리와 통계학 등의 분야에서 자주 사용됨
실행 완료
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/1884602972.py in <module>
1 # SVD적용
----> 2 df = data.copy()
3 pca = TruncatedSVD(n_components=2)
4 df = pca.fit_transform(df)
NameError: name 'data' is not defined
코드 실행
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/tmp/ipykernel_13/2436001672.py in <module>
1 # 시각화
----> 2 df = pd.DataFrame(df)
3 plt.scatter(df.iloc[:,0], df.iloc[:,1], c=dataset.target)
NameError: name 'pd' is not defined