헷갈 & 새로운 개념들

Like Sunnysideup·2024년 11월 26일

1. contains / in

# '삼양'으로 시작하는 회사 찾기
filtered_data = data[data['company'].str.contains('^삼양')]

print(filtered_data)

# R : 
   company
0  삼양식품
2     삼양
4   삼양라면

#################################################
company = '삼양식품'

# '삼양'이 문자열에 포함되어 있는지 확인
if '삼양' in company:
    print("삼양 관련 회사입니다.")

# R : 
삼양 관련 회사입니다.

2. NumPy / List

# 리스트 → NumPy 배열

import numpy as np

# Python 리스트
list_data = [1, 2, 3]

# NumPy 배열로 변환
array_data = np.array(list_data)
print(array_data)  

# R
[1 2 3]

#####################################

# NumPy 배열
array_data = np.array([1, 2, 3])

# Python 리스트로 변환
list_data = array_data.tolist()
print(list_data)  

# R 
[1, 2, 3]

배열 조건

  • OpenCV는 기본적으로 NumPy 배열을 사용해 이미지를 다룸
  • cv2.Canny는 기본적으로 그레이스케일 이미지(2차원 배열)를 입력으로 요구

3. Subplot 생성 방법

ax[row][col] 방식:

  • 행렬 형태로 정렬된 데이터를 시각화할 때 사용.
  • 예: 이미지 필터, 혼동 행렬, 모델 결과 비교 등.
fig, ax = plt.subplots(2, 3, figsize=(10, 6))

for row in range(2):
    for col in range(3):
        ax[row][col].imshow(data[row*3+col][0], cmap='gray')
        ax[row][col].set_title(f"Category: {data[row*3+col][1]}")

plt.subplot 방식:

  • 순차적으로 데이터 출력할 때 간단히 사용.
  • 예: 데이터 검토, 무작위 샘플 시각화 등.
plt.figure(figsize=(8, 5))

for i in range(9):
    random = np.random.randint(0, len(dataset))

    plt.subplot(3, 3, i+1)
    plt.imshow(cv2.imread(dataset['image_path'][random]))
    plt.title(f"Status: {dataset['mask_status'][random]}")
    plt.axis('off')

4. 공분산 & 상관관계

1) 공분산 (Covariance)

  • 공분산은 두 변수의 공동 변동량을 나타냄
  • 두 변수가 같은 방향으로 변하면 공분산은 양수, 반대 방향으로 변하면 음수가 됩니다.
  • 공분산 값 자체는 두 변수의 단위에 의존하기 때문에 해석이 어려움
  • 단위에 의존적이므로, 값의 크기와 단위가 다른 변수들 간 비교가 어려움
  • 데이터의 변동량을 단순히 비교하거나, 단위에 민감한 분석이 필요한 경우에 사용
  • ex) 두 변수의 변동 방향(양의 상관/음의 상관)을 파악.

2) 상관관계 (Correlation)

  • 상관관계는 공분산을 두 변수의 표준편차로 나누어 값을 -1에서 1 사이로 정규화한 값
  • 값의 크기가 단위에 독립적이므로, 두 변수 간 관계를 비교하거나 해석하는 데 적합
  • 변수 간 상대적인 관계를 분석하고, 다른 변수들과 비교하려는 경우 사용
  • ex) 클릭베이트 여부와 텍스트 유사도 간의 관계 분석

5. Normalization / Generalization / Regularization / Optimization

1) Normalization

  • 데이터 전처리 기법 중 하나
  • 데이터를 일정한 범위나 스케일로 변환하는 과정.
  • 머신러닝 알고리즘이 데이터의 크기 차이에 영향을 받지 않도록 함
  • Gradient Descent와 같은 최적화 알고리즘은 feature의 크기 차이가 클 경우 제대로 수렴하지 못하는데, 정규화를 통해 이런 문제를 해결
  • 방법
    • Min-Max Scaling : 데이터를 [0, 1] 범위로 변환.
    • Z-score Scaling (Standardization) : 데이터를 평균 0, 표준편차 1로 변환

2) Generalization (일반화)

  • 학습한 모델이 새로운 데이터 (Test데이터, 실제환경 etc.)에 대해 잘 작동하는 능력.
  • 너무 복잡한 모델은 학습 데이터에 특화된 규칙만 배우기 쉽지만, 일반화가 잘 된 모델은 데이터의 패턴을 학습해서 새로운 데이터에도 적절히 적용됨
  • Overfitting, Underfitting 방지
  • 방법 :
    • Regularization
    • Cross-Validation
    • 데이터 증강 (Data Augmentation)
    • 적절한 모델 선택 (복잡도 조절)

3) Regularization (정규화 항)

  • Generalization의 한 방법
  • 머신러닝 모델에서 과적합(Overfitting)을 방지하고 일반화 성능을 향상시키기 위한 기법
  • Optimization 과정에서 비용 함수(Loss Function)에 패널티 항(penalty term)을 추가해 모델 파라미터(가중치)를 제한
  • 패널티 항은 모델이 과도하게 큰 가중치(weight)를 갖지 않도록 규제
    • L1 Regularization (Lasso)
      : 비용 함수에 가중치 절댓값의 합을 추가
      : 일부 가중치를 0으로 만들어 feature selection 효과.
    • L2 Regularization (Ridge): 가중치가 큰 값을 가지지 못하게 제약.
      : 비용 함수에 가중치 제곱의 합을 추가
      : 모든 가중치를 작게 만들어 부드럽고 안정적인 모델을 만듦
    • Elastic Net
      : L1과 L2를 결합한 형태

4) Optimization (최적화)

  • 머신러닝에서 모델의 비용 함수(loss function/ 예측오류)를 최소화하는 가중치(weight)와 절편(bias) 등의 파라미터를 찾는 과정

  • 적절한 최적화를 통해 모델이 데이터에 잘 맞는 파라미터를 학습

  • 방법

    • 비용 함수 (Loss Function)
      : 비용 함수는 모델의 성능을 수치적으로 평가하는 기준.
      : 모델이 학습 중 최적화해야 할 대상 = 비용 함수 값을 최소화
      : 예: MSE(Mean Squared Error), Log Loss, Hinge Loss 등.
    • 최적화 알고리즘
      : 기울기와 학습률을 조합하여 효율적이고 안정적으로 비용 함수 값을 최소화
      : 기울기 - 비용 함수의 변화율. 비용 함수의 최소값에 도달하기 위한 방향과 크기를 제공
      : 학습률 - 기울기를 따라 이동할 거리(업데이트 크기)를 결정. 기울기의 크기를 얼마나 반영해 파라미터를 업데이트할지 결정 (하이퍼파라미터).
      • 최적화 알고리즘: 산에서 가장 낮은 지점을 찾는 방법.
      • 기울기: 현재 위치에서 산이 얼마나 가파르게 내려가는지 알려주는 값.
      • 학습률: 한 번의 이동에서 얼마나 멀리 가야 하는지 결정.
  • Optimization: 시험 대비 공부 (현재 교재에서 최대한 좋은 성적 얻기).

  • Regularization: 공부할 범위를 제한 (모든 걸 외우지 않고 중요한 것만 학습).

  • Generalization: 실제 시험에서 좋은 성적 얻기 (새로운 문제를 잘 푸는 능력).

6. 로그 스케일 (Logarithmic Scale)

  • 데이터를 표시할 때 축의 값을 로그 함수를 사용하여 표현하는 스케일
  • 값의 범위가 매우 클 때 작은 값과 큰 값을 모두 효과적으로 시각화하거나 분석하기 위해 사용 (ex. 1에서 1,000,000까지)
  • 축의 간격이 값의 비율에 따라 증가 (ex. 1, 10, 100, 1000)
  • 사용 목적
    - 값의 범위가 매우 넓을 때 데이터를 보기 쉽게 만듦
    • 지수적으로 증가하거나 감소하는 데이터(예: 인구 성장, 병원균 확산, 투자 수익률)를 표시
    • 절대적인 차이 대신, 값 간의 비율을 강조
  • usually C and alpha (regularization) are searched for on a logarithmic scale
    - 하이퍼파라미터 값을 선형적으로 탐색하면 일부 범위에서 너무 세밀한 탐색을 하게 되고, 중요한 값 범위를 놓칠 가능성이 큼
    • 로그 스케일로 검색하면 중요한 값 범위를 적절히 탐색하면서 효율적으로 결과를 얻을 수 있음
dataset['Fare'] = dataset['Fare'].apply(lambda x: np.log(x) if x>0 else 0)

7. Linear Model

  • 데이터의 입력(feature)와 출력(target) 사이의 관계를 직선(또는 초평면)으로 나타내는 모델.
  • 결정 경계(decision boundary)가 직선(2D), 평면(3D), 또는 초평면(hyperplane)
  • 회귀 모델 (Regression):
    - Linear Regression (선형 회귀)
    - Ridge Regression (L2 Regularization)
    - Lasso Regression (L1 Regularization)
  • 분류 모델 (Classification): 둘 다 선형 결정 경계를 학습
    - Logistic Regression
    - Linear SVM (선형 커널 사용 시)

8. 최적화 알고리즘 종류

9. NLP

1) 형태소 분석
: 텍스트 데이터를 작은 단위(형태소)로 나누고, 각 단어에 품사 정보를 부여하는 과정
: KoNLPy, KIWI, Mecab, Khaiii 등

2) 형태소 벡터화 & 임베딩
: 임베딩) 텍스트 데이터(형태소 분석 결과(형태소 + 품사 정보))를 숫자 벡터로 변환하는 과정
: 텍스트를 기계 학습 모델이 처리할 수 있는 형식으로 변환하기 위해 필수적
: BoW와 TF-IDF는 단순히 단어 빈도와 중요도를 기반으로 벡터를 생성하며, 텍스트 간 유사성을 계산할 때 사용
: 하지만, 이 방식은 단어 간의 의미적 관계나 문맥 정보를 반영하지 못하기 때문에 딥러닝 기반 임베딩(Word2Vec, FastText, SBERT 등)보다 단순한 벡터화 기법으로 간주

  • TF-IDF 행렬
    : 전체 문서 집합의 단어 사전에 따라 벡터화
    : 특정 문서에 등장하지 않는 단어도 해당 열(column)을 할당받으며, 그 값은 0으로 채워짐
    : TfidfVectorizer를 사용하면 텍스트 데이터를 벡터화한 결과가 csr_matrix 형식으로 반환됨 (희소 행렬(sparse matrix))
# 피싱뉴스 프로젝트 

from scipy.sparse import hstack, csr_matrix
from sklearn.feature_extraction.text import TfidfVectorizer

# 1. TF-IDF 벡터화
tfidf_vectorizer = TfidfVectorizer()
content_tfidf = tfidf_vectorizer.fit_transform(data['int_Content'])  # 별도 변수에 저장

# 2. 수치형 데이터 변환
numeric_features = csr_matrix(data.select_dtypes(include=['number']).values)

# 3. hstack으로 결합
tfidf_numeric_features = hstack((content_tfidf, numeric_features))

# 결과 확인
print("Combined Features Shape:", tfidf_numeric_features.shape)

  • Hugging Face 모델
    • 사전 학습된 딥러닝 모델
      : Hugging Face의 모델(예: BERT, RoBERTa)은 대규모 데이터로 사전 학습된 딥러닝 기반 언어 모델
    • Fine-Tuning
      : Hugging Face 모델을 특정 작업(예: clickbait 탐지)에 맞게 추가 학습시키는 과정이 머신러닝 중 전이 학습(Transfer Learning)에 해당
    • 훈련 및 추론
      : 허깅페이스 모델은 입력 데이터를 학습해 새로운 데이터를 예측하는 머신러닝 프로세스를 수행

3) 유사도 분석
: 벡터화된 결과를 사용해 형태소 또는 텍스트 간의 유사도를 계산
: 코사인 유사도, 유클리드 거리, 자카드 유사도 등

10. CV

1) cross_val_score

  • 각 fold의 점수를 반환하므로, 모델의 평균 성능과 표준 편차를 확인할 수 있음
  • 여러 모델을 비교하려면 cross_val_score가 유용
scores = cross_val_score(model, X, y, cv=10, scoring='accuracy')
print("Mean Accuracy:", scores.mean())
print("Std Deviation:", scores.std())

2) cross_val_predict

  • 데이터에 대한 예측값(y_pred)을 반환

  • 이를 사용해 혼동 행렬(confusion_matrix), 분류 리포트(classification_report) 등 추가적인 분석이 가능

  • 내부적으로 데이터를 K-fold로 나누어, 각 fold마다 모델의 fit과 predict를 자동으로 수행

  • train_test_split이 별도 필요하지 않으나, 교차 검증은 모델의 성능을 내부적으로 평가하는 도구일 뿐, 테스트 데이터에서의 최종 성능을 보장하지 않음

  • train_test_split을 사용하는 경우:

    1. 데이터를 train_test_split으로 X_train, X_test, y_train, y_test로 나눔.
    2. 교차 검증(cross_val_predict)은 X_train, y_train만 사용.
    3. 최종적으로 X_test, y_test를 사용해 모델 성능을 평가.
  • train_test_split 없이도 되는 경우

    • 테스트 데이터가 따로 필요하지 않은 간단한 평가나 분석.
    • 독립적인 테스트 세트가 없으면 일반화 성능 평가가 어렵
    • 독립적인 테스트 세트를 사용하지 않으면, 데이터 누수(Data Leakage)나 과적합(Overfitting) 여부를 확실히 확인할 수 없음
  • cross_val_predict와 train_test_split의 조합

from sklearn.model_selection import train_test_split, cross_val_predict
from sklearn.metrics import confusion_matrix, classification_report

# 데이터를 train/test로 나누기
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 교차 검증을 통해 훈련 데이터의 예측값 생성
y_pred_train = cross_val_predict(model, X_train, y_train, cv=10)

# 혼동 행렬 (훈련 데이터)
cm_train = confusion_matrix(y_train, y_pred_train)
print("Confusion Matrix (Train):\n", cm_train)

# 모델 학습 후 테스트 데이터 평가
model.fit(X_train, y_train)
y_pred_test = model.predict(X_test)

# 혼동 행렬 및 분류 리포트 (테스트 데이터)
cm_test = confusion_matrix(y_test, y_pred_test)
print("Confusion Matrix (Test):\n", cm_test)
print(classification_report(y_test, y_pred_test))

3) Grid Search

  • 주어진 하이퍼파라미터 조합에 대해 교차 검증을 수행하여 모델 성능을 평가
  • 모든 조합을 탐색하여 최적의 하이퍼파라미터 값을 찾음
    1. 데이터를 train과 test로 분리
    2. GridSearchCV 사용
      : GridSearchCV는 내부적으로 X_train과 y_train에서 train/validation 세트를 나누며 교차 검증 수행
    3. 테스트 세트에서 최적 모델 평가
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=5)
grid_search.fit(X_train, y_train)

best_model = grid_search.best_estimator_
test_score = best_model.score(X_test, y_test)
print("Test Score: ", test_score)

11. Confusion Matrix / ROC Curve

1) Confusion Matrix

  • Accuracy : 모델이 올바르게 예측한 비율 = 전체 예측 중 예측 진짜들 (TP + TN)
  • Recall : 실제 진짜 중 예측 진짜
  • Precision : 예측 진짜 중 실제 진짜

2) ROC Curve

  • FPR against TPR

  • FPR : 실제 가짜 중 예측 진짜

  • TPR : 실제 진짜 중 예측 진짜

  • AUC (Area Under the Curve)
    : ROC 곡선(Receiver Operating Characteristic Curve)의 아래 면적
    : AUC는 모델의 클래스를 구분하는 능력
    : 양성 샘플이 음성 샘플보다 더 높은 점수를 받을 확률로 계산
    : AUC는 다양한 Threshold에서의 성능을 평가
    : 특정 Threshold에서 발생하는 Accuracy와 달리, 전체적인 분류 성능을 평가
    : 예) 99%가 정상, 1%가 이상인 데이터 (이상 탐지)
    (Accuracy는 항상 높은 값을 보일 수 있으므로 AUC로 분류 능력을 평가)
    : 모델의 전체적인 분류 성능을 평가하고 싶을 때

  • Accuracy
    : 균형 데이터에 적합
    : 불균형 데이터에 취약
    (특정 클래스의 비율이 매우 높거나 낮으면 성능을 과대평가하거나 과소평가)
    : 예) 스팸 메일 50%, 정상 메일 50%인 데이터
    (특정 Threshold에서의 분류 성능을 직접 평가)

12. 숫자형/ 문자열 데이터 연산

  • 숫자형 데이터: 비교 연산, 산술 연산 등은 벡터화 연산 사용.
  • 문자열 데이터:
    - 간단한 연산: str 접근자 사용.
    - 복잡한 조건이나 함수: apply() 사용.

1) 숫자형 데이터와 벡터화 연산

  • 숫자형 데이터에 대한 연산(비교, 산술 등)은 벡터화 연산을 사용
  • 벡터화 연산은 데이터의 각 요소에 대해 반복문 없이 한 번에 연산을 수행하는 방식.
    numpy나 pandas가 내부적으로 최적화된 C 언어 코드로 실행되기 때문에 매우 빠름
  • 따라서 apply()를 사용할 필요가 없음
outliers = df[(df['Age'] < 18) | (df['Age'] > 60)].index

2) 문자열 데이터와 apply()

  • 문자열 데이터는 산술 연산이나 비교 연산이 직접적으로 지원되지 않기 때문에 apply()나 str 접근자를 사용하는 경우가 많음
  • apply()는 각 행이나 열에 사용자 정의 함수(람다 함수 포함)를 적용할 때 유용
# 문자열 길이를 계산
df['Name_length'] = df['Name'].apply(len)

# 특정 문자열이 포함된 행 필터링
df['Has_Mr'] = df['Name'].apply(lambda x: 'Mr' in x)

3) str 접근자를 활용한 벡터화 연산

  • Pandas는 문자열 데이터에서도 일부 벡터화 연산을 지원
  • str 접근자를 사용하면 벡터화 연산처럼 문자열 데이터를 처리할 수 있음
코드 복사
# Name 열에 'Mr' 문자열이 포함된 행 확인 (벡터화 연산)
df['Has_Mr'] = df['Name'].str.contains('Mr')

# 문자열 길이 계산
df['Name_length'] = df['Name'].str.len()

13. ML 모델

1) AdaBoost (Adaptive Boosting)

  • 부스팅(Boosting) 알고리즘의 하나로, 약한 학습기(Weak Learner)를 결합하여 강한 학습기(Strong Learner)를 만드는 앙상블 학습 방법
  • 부스팅은 순차적으로 모델을 학습시키고, 이전 모델에서 잘못 예측한 샘플에 가중치를 더 많이 부여하여 학습하는 방식
  • 약한 학습기의 결과를 합산하여 최종 예측을 수행
  • 가벼운(estimator가 빠르게 학습 가능한) 모델과 잘 어울림
  • 단점
    - 노이즈 민감성: 데이터에 노이즈가 많을 경우, 잘못된 샘플에 과도하게 가중치를 부여할 수 있음
    • 너무 복잡한 모델(예: 깊은 결정 트리, 대규모 SVM)을 사용하면 효율이 낮아질 수 있음
    • 하이퍼파라미터 튜닝: 학습률(learning rate), 약한 학습기의 수 등 최적의 하이퍼파라미터를 찾기 위해 추가 작업이 필요
  • 하이퍼파라미터 :
    - estimator (기본값: DecisionTreeClassifier)
    • n_estimators
    • learning_rate
    • algorithm ; SAMME 또는 SAMME.R

14. 데이터 타입

  • 실수(float)는 보통 연속형 데이터(continuous data)를 표현
    - 데이터 간의 차이가 일정
  • 정수(integer)는 보통 서열(순서) 데이터 또는 이산형 데이터(discrete data)를 표현
    - 값 간의 순서가 중요하지만, 간격이 일정하지 않을 수 있음

15. Pandas - 데이터 차원

  • train['ps_reg_03']처럼 대괄호를 1개만 사용하면 Series(1차원 데이터)가 반환
  • 반면, train[['ps_reg_03']]처럼 대괄호를 2개 사용하면 DataFrame(2차원 데이터)이 반환

16. 인코딩 (데이터 전처리)

1) Target Encoding - Smoothing

  • 범주형 변수를 타겟 값의 평균 또는 기타 통계량으로 변환
  • 범주형 데이터를 타겟 변수와 결합해 새롭게 계산된 값으로 변환하는 과정에 사용
  • 데이터의 극단적인 값이나 변동성을 완화하고, 보다 안정적인 값을 계산하는 데 사용 (일반화 성능 향상)
  • 범주의 데이터 개수에 따라 그룹 평균과 전체 평균(prior)을 가중 조합
  • 스무딩된 평균 = (전체 평균)⋅(1−스무딩) + (범주 평균)⋅(스무딩)
    • Target Encoding에서 스무딩을 사용하는 과정은 범주형 데이터를 수치형 값으로 변환하여 모델이 타겟 값을 더 잘 예측할 수 있도록 논리를 형성하는 과정
    • 범주형 데이터를 타겟 변수와 비교하여 각 범주가 타겟에 대해 어떤 평균적인 값을 가지는지 계산
    • 이 과정에서 범주형 데이터가 타겟을 예측하는 데 얼마나 중요한지 논리적인 근거를 형성
    • 스무딩은 데이터의 신뢰도를 반영하여 불안정한 정보를 일반화하는 역할.
    • 데이터가 적은 범주는 타겟 값과의 관계를 명확히 학습하기 어려우므로, 전체 평균(prior)을 더 많이 반영하여 안정성을 높임
    • 데이터가 많은 범주는 그룹 평균을 더 신뢰하여 해당 범주가 가진 독립적인 정보를 반영

17. 리스트 합치기

noun_lists = dc['명사'].tolist()
noun_list = sum(noun_lists, []) 
noun_sent = ' '.join(noun_list) 
noun_tokens = noun_sent.split()

# r: 
noun_lists = [ ['양갱', '대여', '편의점', '품절'], ['편의점', '차기작', '게임', '공포', '게임'] ..]
noun_list = ['양갱', '대여', '편의점', '품절', '편의점', '차기작', '게임', '공포', '게임' ..] # 하나의 리스트로 합침
noun_sent = '양갱 대여 편의점 품절 편의점 차기작 게임 .. ' # 하나의 문자열로 합침
noun_tokens = [ '양갱', '대여', '편의점', '품절', '편의점', '차기작', '게임', '공포', '게임' ..] 

18. PolynomialFeatures (Feature Engineering)

  • 서로 다른 열을 결합해 다항식 항과 상호작용 항을 의도적으로 생성하고, 모델이 변수 간의 비선형 관계와 상호작용 효과를 학습할 수 있도록 데이터의 표현력 확장
  • interaction_only=False : 각 변수의 제곱, 세제곱 등 다항식 항이 타겟 변수와의 관계를 설명하는 데 중요한 역할을 할 때 사용. 즉, 개별 변수와 타겟 간의 비선형 관계를 모델링해야 할 때 사용
  • interaction_only=False : 모델이 두 변수 간의 곱에 의해 설명되는 효과를 학습해야 할 때 사용. (예: 마케팅 예산(광고비)과 고객 참여율(이벤트 참여)이 결합되어 매출에 영향을 미치는 경우)
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2, interaction_only=False, include_bias=False)
print(poly.fit_transform(X))

19. Under-Fitting

  • 모델이 너무 단순하여 학습 데이터의 패턴이나 복잡성을 제대로 학습하지 못하는 상태
  • 훈련 데이터와 테스트 데이터 모두에서 성능이 낮은 상태가 됨
  • 모델이 고편향(high bias) 상태일 때 발생
  • 언더피팅은 데이터의 크기보다는 모델의 구조와 설정 문제에서 비롯되므로 데이터를 더 추가한다고 해결되지 않음
  • 해결 방법
    • 모델 복잡도 증가
      : 더 복잡한 모델을 사용하거나, 더 많은 파라미터를 가진 모델로 변경
      : 단순 선형 회귀 대신 다항 회귀(Polynomial Regression) 사용
    • 하이퍼파라미터 튜닝:
      : 학습률을 높이거나, 규제(regularization)를 완화
      : L1, L2 정규화 강도를 줄임.
    • 특성 엔지니어링
      : 중요한 특성을 추가하거나, 비선형 특성을 생성
      : 다항 특성(Polynomial Features) 추가.
    • 훈련 반복 수 증가:
      : Epoch 수를 늘려 모델이 충분히 학습할 수 있도록 함
profile
Perfect timing to be a Newbie

0개의 댓글