머신러닝에서 다차원 배열을 1차원 배열로 바꾸는 이유
머신러닝 모델을 구현하는 과정에서 타겟 레이블(y) 데이터를 다차원 배열에서 1차원 배열로 변환하는 코드는 자주 사용된다.
예시:
train_y = np.ravel(train_y)
또는
train_y = train_y.reshape(-1,)
해당 변환을 수행하는 이유는 다음과 같다.
1. Scikit-learn은 타겟 벡터를 1차원으로 요구함
Scikit-learn의 대부분의 지도 학습 모델은 타겟 값(y)이 다음 형태이길 기대한다.
- 권장 형태: (n_samples,) → 1차원
- 잘못된 형태: (n_samples, 1) → 2차원
예를 들어, 다음과 같은 경우 오류가 발생할 수 있다:
from sklearn.ensemble import RandomForestRegressor
# 잘못된 형태
y = np.array([[1], [0], [1], [0]]) # shape: (4, 1)
model = RandomForestRegressor()
model.fit(X, y) # ValueError 발생 가능
따라서, y를 np.ravel() 또는 .reshape(-1,)로 1차원으로 변환해야 한다.
2. 모델 내부 연산은 벡터 연산 기반
머신러닝 모델은 내부적으로 벡터 연산을 수행하며, 타겟값을 벡터로 간주한다. 2차원 형태의 타겟은 이 연산을 방해하므로, 1차원으로 변환하여 처리해야 한다.
3. 불필요한 차원의 제거
데이터프레임에서 특정 컬럼을 슬라이싱할 때, 종종 불필요한 차원이 포함될 수 있다.
예시:
y = df[['target']] # shape: (n, 1)
y = df['target'] # shape: (n,)
또는,
y = df.iloc[:, [0]] # shape: (n, 1)
y = df.iloc[:, 0] # shape: (n,)
위와 같이, 열 하나만 선택했더라도 결과가 2차원이 될 수 있으며, 이 경우에도 평탄화 작업이 필요하다.
4. 변환 방법 비교
방법 설명
np.ravel() | 복사 없이 1차원으로 변환 |
.reshape(-1,) | 원하는 모양으로 변환 (복사 가능성 있음) |
.flatten() | 복사하여 1차원으로 변환 |
대부분의 경우 np.ravel()을 사용하는 것이 빠르고 안전하다.
결론
머신러닝 모델은 타겟 레이블이 1차원 배열 형태일 것을 요구한다. 따라서, 2차원 배열로 존재하는 경우에는 np.ravel() 또는 .reshape(-1,) 등을 사용하여 1차원으로 변환해야 한다. 이는 오류를 방지하고 모델 학습 및 예측을 정상적으로 수행하기 위한 필수 전처리 작업이다.
'AI ( Artificial Intelligence )' 카테고리의 다른 글
[ 앙상블 ( 랜덤포레스트, 그래디언트 부스팅, XGBoost ) ] (1) | 2025.04.08 |
---|---|
[ Overfitting vs Underfitting ] (0) | 2025.04.08 |
토크나이저(Tokenize) (0) | 2025.04.05 |
Lexical 검색과 Semantic 검색 (0) | 2025.03.30 |
Streaming module (0) | 2024.10.31 |