정규화
정규화는 입력 데이터의 분포를 일정한 범위로 조정하여, 모델의 학습을 안정화하고 성능을 향상시키는 기법임
배치 정규화 : 각 미니배치의 평균과 분산을 사용하여 정규화함 이는 학습 속도를 높이고, 과적합을 방지하는 데 도움이 됨
레이어 정규화 : 각 레이어의 뉴런 출력을 정규화함
그룹 정규화를 사용하려면 충분한 공부 후에 사용할 것
드롭아웃
조기 종료와 데이터 증강
조기 종료 기법
데이터 증강 기법
학습률
배치 크기
에포크 수
모멘텀
가중치 초기화
교차 검증의 필요성
Pytorch
최적화 알고리즘
GPU 사용 (병렬로 동작을 위하여)
device = torch(device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
inputs, targets = inputs.to(device).targets.to(device)
-> 직접 해봐야 함!!!!
머신러닝
1. 구성요소
데이터 셋
보통 80%를 학습에 사용하며 해당 데이터는 규칙을 뽑아내는데에 사용됨,
20%는 학습된 데이터로 테스트, 즉 성능을 검증하는데에 사용됨
레이블
예측하고자 하는 목표 변수
지도/비지도 여부에 따라 레이블의 데이터 셋 포함 여부가 달라짐
학습
데이터를 통해서 패턴을 인식하고, 이를 기반으로 예측을 수행할 수 있도록 함수 내의 가중치를 조절하는 과정
2. 학습 방법
지도 학습
레이블이 있는 데이터셋을 이용하여 모델을 학습시키는 방법
회귀: 연속적인 값을 예측
분류: 이산적인 값을 예측
비지도 학습
지도 학습의 반대
군집화 : 데이터를 유사한 그룹으로 묶는 문제
차원 축소 : 고차원 데이터를 저차원으로 변환
앙상블 학습
여러 개의 머신 러닝 모델을 결합하여 더 나은 성능을 얻는 방법
- 배깅 : 여러 모델을 독립적으로 학습시키고, 예측을 내거나 다수결 투표로 최종 예측 (ex. 랜덤 포레스트)
- 부스팅 : 여러 모델을 순차적으로 학습시키고, 이진 모델의 오차를 보완하여 최종 예측을 수행
(ex. 그래디언트 부스팅, XGBoost)
- 스태킹 : 여러 모델을 학습시키고 예측 결과를 새로운 데이터로 사용하여 메타 모델을 학습
3. 데이터 스케일링
Q. 왜 학습 데이터에서만 fit_transform을 하고
테스트 데이터에 대해서는 transform만 진행을 해야 하는 것인가?
A. 테스트 데이터에 대해서는 학습 데이터에서 적용된 평균과 표준 편차가 사용되어야 하기 때문에 추가적으로 fit 작업을 하지 않음.
fit은 학습 데이터를 반영하지 않은 테스트 데이터에 대한 독립적인 평균과 분산을 반영한 결과이기 때문임
# 사이킷 런의 내장 함수인 train_test_split 사용
# 학습, 즉 규칙을 파악할 용도의 데이터 : X_train, y_train
# 테스트의 입력 데이터 : X_test
# 테스트의 출력 데이터 : y_test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 데이터 스케일링
scaler = StandardScaler()
# 학습 데이터에 대해 통계 정보를 저장 및 변환하여 학습 데이터에 저장
X_train = scaler.fit_transform(X_train)
# 테스트 데이터에 대해서는 변환작업만 진행
X_test = scaler.transform(X_test)
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
# 모델 생성 및 학습
model = LogisticRegression()
model.fit(X_train, y)
# 예측
y_pred = model.predict(y)
print(accuracy_score(y, y_pred))
# 예측
y_train = scaler.transform(y)
y_pred = model.predict(y_train)
print(accuracy_score(y, y_pred))
4. 전처리
결측치 처리
1. 삭제 : dropna(axis=1) # 열 단위로 하고 싶다면 axis=1
2. 대체 : fillna(df.mean()) # 주의해야 할 점은 값의 type과 일치시켜야 한다는 점임, 최빈 값으로 대체하려면 df.mode().iloc[0]
3. 예측
이상치 처리
# 제거
# 중복된 행 확인
print(df.duplicated().sum())
# 중복된 행 제거
df_no_duplicates = df.drop_duplicates()
# 변환
# 평균으로 대체
mean_value = df['column_name'].mean()
df['column_name'] = df['column_name'].apply(lambda x: mean_value if x < lower_bound or x > upper_bound else x)
- SVM
- 분류와 회귀 분석에 사용되는 강력한 지도학습 모델
- 초평면은 두 클래스 사이의 최대 마진을 보장하는 방식으로 선택
- 목표는 마진을 최대화하면서 결정 초평면을 찾아 데이터 포인트를 정확하게 분류하는 것임
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
# 4. 모델 생성 및 학습
model = SVC(kernel='linear')
model.fit(X_train, y_train)
# 5. 예측
y_pred = model.predict(X_test)
# 6. 평가
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")
print(f"Classification Report:\n{classification_report(y_test, y_pred)}")
print(f"Confusion Matrix:\n{confusion_matrix(y_test, y_pred)}")
- KNN
- 새로운 데이터 포인트를 기존 데이터 포인트 중 가장 가까운 k개의 이웃과 비교하여 분류함
- 데이터 포인트의 특성을 기준을 거리 계산을 통해 가장 가까운 이웃을 찾음
# 모델 생성 및 학습
model = KNeighborsClassifier(n_neighbors=5)
model.fit(X_train, y_train)
# 예측
y_pred = model.predict(X_test)
# 평가
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")
print(f"Classification Report:\n{classification_report(y_test, y_pred)}")
print(f"Confusion Matrix:\n{confusion_matrix(y_test, y_pred)}")
- 나이브베이즈
- 주어진 데이터 포인트가 특정 클래스에 속할 확률을 계산하여 분류하는 것을 말함
- 텍스트 분류와 같은 문제에서 좋은 성능을 발휘함
- 가우시안 나이브베이즈 : 특징들이 연속적이고 정규 분포를 따른다고 가정
- 베르누아 나이브베이즈 : 특징들이 이진수로 표현되는 경우 사용
- 멀티노미얼 나이브베이즈 : 특징들이 다항 분포를 따르는 경우 사용
- 많은 경우 가우시안 나이브베이즈 사용
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
# 모델 생성 및 학습
model = GaussianNB()
model.fit(X_train, y_train)
# 예측
y_pred = model.predict(X_test)
# 평가
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")
print(f"Classification Report:\n{classification_report(y_test, y_pred)}")
print(f"Confusion Matrix:\n{confusion_matrix(y_test, y_pred)}")
- 의사결정 나무
- 예측 모델 중 하나로 데이터의 특징을 기준으로 의사결정 규칙을 만들고 이를 바탕으로 데이터를 분류학나 회귀하는데 사용
- 트리 구조를 가지며 불확실성이 더 나아지지 않을 곳까지 분할
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
# 모델 생성 및 학습
model = DecisionTreeClassifier(random_state=42)
model.fit(X_train, y_train)
# 예측
y_pred = model.predict(X_test)
# 평가
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")
print(f"Classification Report:\n{classification_report(y_test, y_pred)}")
print(f"Confusion Matrix:\n{confusion_matrix(y_test, y_pred)}")
- K-means clustering 알고리즘
- 초기화 : k개의 군집 중심을 랜덤하게 설정
- 할당 단계 : 각 데이터 포인트를 가장 가까운 군집 중심에 할당함
- 업데이트 단계 : 각 군집의 중심을 해당 군집에 속한 데이터 포인트들의 평균으로 업데이트 함
- 반복 : 할당 단계와 업데이트 단계를 군집 중심이 더이상 변화하지 않을 때까지 반복함
- 계층적 군집화 알고리즘
- 데이터 포인트를 계층 구조로 그룹화하는 방법
- 데이터 포인트를 점진적으로 병합하거나 분할하여 군집을 형성함
- DBSCAN
- 밀도 기반 군집화 알고리즘
- 차원축소 - PCA
- 차원이 낮을 수록 연산이 줄어들기 때문에 더 효율적
- 데이터의 분산을 최대한 보존하면서, 데이터의 주요 특징을 추출해 저차원 공간으로 변환하는 것을 말함
- 차원축소 - t-SNE
- 데이터가 배치된 것을 보고 확률을 계산한 후 낮은 차원에서 유사하게 배치함
- 고차원에서 데이터 배치랑 저차원에서의 배치를 유사하게 배치한다는 것임
- 비선형 기반을 탐지할 수 있는 장점이 있음
- 차원축소 - LDA
- 차원축소와 분류를 동시에 수행함
- 데이터의 클래스 간 분산을 최대화하고, 클래스 내 분산을 최소화하는 방향으로 데이터를 변환함
- 데이터의 분류 성능을 향상시키고, 저차원 공간에서 데이터의 구조를 시각화할 수 있음
배깅 : 여러 개의 학습 모델을 병렬로 학습시키고, 그 예측 결과를 평균 또는 다수결로 결합하는 앙상블 기법
부스팅 : 여러 개의 약한 학습기를 순차적으로 학습시키고, 그 예측 결과를 결합하여 강한 학습기를 만드는 앙상블 기법
에러 핸들링
---------------------------------------------------------------------------
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[29], line 2
1 # 예측
----> 2 y_pred = model.predict(y)
4 print(accuracy_score(y, y_pred))
File /opt/anaconda3/envs/dipLearning/lib/python3.12/site-packages/sklearn/linear_model/_base.py:382, in LinearClassifierMixin.predict(self, X)
368 """
369 Predict class labels for samples in X.
370
(...)
379 Vector containing the class labels for each sample.
380 """
381 xp, _ = get_namespace(X)
--> 382 scores = self.decision_function(X)
383 if len(scores.shape) == 1:
384 indices = xp.astype(scores > 0, indexing_dtype(xp))
File /opt/anaconda3/envs/dipLearning/lib/python3.12/site-packages/sklearn/linear_model/_base.py:363, in LinearClassifierMixin.decision_function(self, X)
360 check_is_fitted(self)
361 xp, _ = get_namespace(X)
--> 363 X = self._validate_data(X, accept_sparse="csr", reset=False)
364 scores = safe_sparse_dot(X, self.coef_.T, dense_output=True) + self.intercept_
365 return xp.reshape(scores, (-1,)) if scores.shape[1] == 1 else scores
File /opt/anaconda3/envs/dipLearning/lib/python3.12/site-packages/sklearn/base.py:633, in BaseEstimator._validate_data(self, X, y, reset, validate_separately, cast_to_ndarray, **check_params)
631 out = X, y
632 elif not no_val_X and no_val_y:
--> 633 out = check_array(X, input_name="X", **check_params)
634 elif no_val_X and not no_val_y:
635 out = _check_y(y, **check_params)
File /opt/anaconda3/envs/dipLearning/lib/python3.12/site-packages/sklearn/utils/validation.py:1050, in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_writeable, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator, input_name)
1043 else:
1044 msg = (
1045 f"Expected 2D array, got 1D array instead:\narray={array}.\n"
1046 "Reshape your data either using array.reshape(-1, 1) if "
1047 "your data has a single feature or array.reshape(1, -1) "
1048 "if it contains a single sample."
1049 )
-> 1050 raise ValueError(msg)
1052 if dtype_numeric and hasattr(array.dtype, "kind") and array.dtype.kind in "USV":
1053 raise ValueError(
1054 "dtype='numeric' is not compatible with arrays of bytes/strings."
1055 "Convert your data to numeric values explicitly instead."
1056 )
ValueError: Expected a 2-dimensional container but got <class 'pandas.core.series.Series'> instead. Pass a DataFrame containing a single row (i.e. single sample) or a single column (i.e. single feature) instead.
X_test에도 fit_transform을 적용시키지 않고 predict에 테스트를 위한 입력데이터가 아닌 다른 값을 넣어줬을 때 발생하는 에러이다.
X_train, y_train은 학습을 위해 사용되며
X_test는 테스트용 입력데이터이다.
테스트용 입력데이터 역시 fit_transform을 거친, 즉 평균과 분산 처리를 거친, transform을 했었어야 했기 때문에 차원 변환이 안되었다는 에러를 마주하게 되었다.