여기, 여기가 이해하기 쉬운편

다만 TF-IDF실제 계산 수치가 따로 해보면 똑같이 잘 안나온다.

 

Q. TF-IDF계산하면 원본 문장에서 단어별로 TF-IDF스칼라 값이 하나 나온다?

A. 맞다.

 

 

반응형

'AI, ML > ML' 카테고리의 다른 글

문자열을 벡터로 바꾸는 방법2 - TfidfVectorizer  (0) 2024.03.12
문자열을 벡터로 바꾸는 방법1 - CountVectorizer  (0) 2024.03.12
cardinality  (1) 2024.01.07
dense feature vs sparse feature  (0) 2024.01.07
binning  (0) 2023.12.28

TF-IDF는 여기 참조

 

예시코드

from sklearn.feature_extraction.text import TfidfVectorizer
text_data = ['사과 바나나 자동차', '바나나 자동차 기차',
    '자동차 기차 사과 포도', '바다 사과 기차 여름']
    
tfidfvec = TfidfVectorizer()

tfidfvec.fit(text_data)
print("Vocabulary: ", tfidfvec.vocabulary_)


sentence = [text_data[0]]
print(sentence)
print(tfidfvec.transform(sentence).toarray())

 

결과

Vocabulary:  {'사과': 3, '바나나': 1, '자동차': 5, '기차': 0, '포도': 6, '바다': 2, '여름': 4}
['사과 바나나 자동차']
[[0.         0.65782931 0.         0.53256952 0.         0.53256952
  0.        ]]

보면 알겠지만 '사과 바나나 자동차' 입력 문장에서의 단어개수가 아닌 전체 단어개수(기차0부터 포도6까지 7개)에 해당하는 벡터가 생성된다.

 

직접 tf-idf값을 계산해보려면 아래 참조

반응형

'AI, ML > ML' 카테고리의 다른 글

TF-IDF  (0) 2024.03.12
문자열을 벡터로 바꾸는 방법1 - CountVectorizer  (0) 2024.03.12
cardinality  (1) 2024.01.07
dense feature vs sparse feature  (0) 2024.01.07
binning  (0) 2023.12.28

여기참조

from sklearn.feature_extraction.text import CountVectorizer

documents = [
    'Hello, how are you? hello',
    'I am fine, thank you.'
]

# CountVectorizer 인스턴스 생성
vectorizer = CountVectorizer()

# 문서를 피팅하고 변환
X = vectorizer.fit_transform(documents)

# 결과를 배열로 변환
X_array = X.toarray()

# 어휘 출력
print("Vocabulary: ", vectorizer.vocabulary_)

# 문서-단어 행렬 출력
print("Document-Term Matrix:\n", X_array)

 

결과

Vocabulary:  {'hello': 3, 'how': 4, 'are': 1, 'you': 6, 'am': 0, 'fine': 2, 'thank': 5}
Document-Term Matrix:
 [[0 1 0 2 1 0 1]
 [1 0 1 0 0 1 1]]

Vocabulary는 단어별로 인덱스를 생성해주는 과정이고,

Document-Term Matrix를 통해 문자열을 벡터화 해준다. 

벡터화 방법은 인덱스 위치별 등장횟수를 카운팅하는 단순한 방법이다.

특징

* 단어를 벡터로 표현한게 아니라. 문장(또는 문서) 전체가 하나의 벡터로 표현된다.

 

CountVector를 통한 스펨메일분류기 만들기

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split

# 샘플 데이터: 이메일 텍스트와 스팸 여부
emails = ["Free money now!!!", "Hi Bob, how about a game of golf tomorrow?", "Exclusive offer, limited time only"]
labels = [1, 0, 1]  # 1: 스팸, 0: 비스팸

# CountVectorizer로 텍스트 벡터화
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(emails)
# 결과를 배열로 변환
X_array = X.toarray()

# 어휘 출력
print("Vocabulary: ", vectorizer.vocabulary_)

# 문서-단어 행렬 출력
print("Document-Term Matrix:\n", X_array)

y = labels

# 데이터를 훈련 세트와 테스트 세트로 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

# 로지스틱 회귀 모델 훈련
model = LogisticRegression()
model.fit(X_train, y_train)

# 스팸 탐지 테스트
print(model.score(X_test, y_test))

 

결과

Vocabulary:  {'free': 3, 'money': 9, 'now': 10, 'hi': 6, 'bob': 1, 'how': 7, 'about': 0, 'game': 4, 'of': 11, 'golf': 5, 'tomorrow': 15, 'exclusive': 2, 'offer': 12, 'limited': 8, 'time': 14, 'only': 13}
Document-Term Matrix:
 [[0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0]
 [1 1 0 0 1 1 1 1 0 0 0 1 0 0 0 1]
 [0 0 1 0 0 0 0 0 1 0 0 0 1 1 1 0]]
1.0

 

문장에서 벡터로 변환하는 방법이 단순하여 실용성은 적다.

하지만 자주 등장하는 단어가 주요하게 쓰이는 경우도 있고, 특징 추출의 기본이기 때문에 알아두어야한다.

반응형

'AI, ML > ML' 카테고리의 다른 글

TF-IDF  (0) 2024.03.12
문자열을 벡터로 바꾸는 방법2 - TfidfVectorizer  (0) 2024.03.12
cardinality  (1) 2024.01.07
dense feature vs sparse feature  (0) 2024.01.07
binning  (0) 2023.12.28

feature가 가질 수 있는 값의 종류.

 

예를 들어 성별은 남자/여자 둘중의 하나이므로 카디널리티가 2이다.

카테고리의 경우 가구/가전/의류 등 세가지 범주를 갖는다면 카디널리티가 3이다.

방의 개수는 대략 1에서 10사이이므로, 이 경우 카디널리티가 10이다.

고객ID/제품SKU등의 경우 매우 높은 카디널리티를 갖는다.

 

위내용까지는 이해가 쉬운데, 연속형 수치를 갖는 feature의 카디널리티는 판단하기 까다로울 수 있다.

예를 들어 일별수익률, 집의 면적, 제품의 가격등이다.

 

수치형 데이터의 카디널리티 판단:

  • 소수점 2자리에서 끊던지 하는 방법으로 어느정도 양자화하고
  • SQL쿼리에서 COUNT(DISTINCT colume)으로 카니널리티 측정

예를 들어 온도보다는 인구수가 카니널리티가 높을것이다.

 

 

반응형

여기 참조

 

개요

일별수익률등 거의 0이 나타나지 않는 feature를 dense feature라고 한다.

원핫 인코딩을 거친 범주형 데이터처럼 0이 매우 많이 나타나고 드물게 0이 아닌 1등이 나타나는 feature를 sparse feature라고 한다.

(원핫 인코딩 여부가 판가름하는 지표가 되기도 한다)

 

한가지 주의할것은 업데이트 주기로 판단하지는 않는 다는 것이다.

예를 들어 GDP값이라는 feature가 있을때, 값은 1년내 거의 고정이지만 이를 sparse feature라고 하지는 않는다. (값의 대부분이 0이진 않기 때문에)

 

모델

XGBoost: 주로 연속적인 수치형 feature(dense feature)에 강점을 가지며, 트리 기반 모델은 feature의 분할을 통해 비선형 관계를 잘 포착함. sparse feature를 사용할때는 카디널리티(cardinality, 고유값의 수)가 높지 않고 연속성이 어느정도 의미가 있는 경우에 효과적.

 

딥러닝모델: dense feature와 sparse feature모두를 효과적으로 처리. sparse feature는 임베딩을 통해 dense vector로 변환되어 처리함.(특히 NLP등에서 중요)

 

즉, 카디널리티가 높지 않은 경우는 XGBoost도 어느정도 sparse feature를 처리할 수 있지만, 카디널리티가 높은 경우는 딥러닝이 임베딩을 통한 기술이 있어서 더 유리하다고 하는 것.

 

 

반응형

'AI, ML > ML' 카테고리의 다른 글

문자열을 벡터로 바꾸는 방법1 - CountVectorizer  (0) 2024.03.12
cardinality  (1) 2024.01.07
binning  (0) 2023.12.28
디시전트리기반 코드 실습  (0) 2023.10.16
그레디언트 부스팅 (Gradient Boosting)  (0) 2023.10.15

Binning: 데이터를 구간으로 나누는 기법

예를들어 나이라는 컬럼을 binning하게 되면 10대, 20대, 30대 등으로 범주화 된다.

 

Binning 사용의 장점:

이상치 감소: Binning은 데이터의 이상치나 노이즈에 덜 민감하게 만들 수 있습니다.
비선형 관계 포착: 특히, 특정 범위 내의 데이터가 결과에 다르게 영향을 미칠 때 유용합니다.
해석 용이성: 데이터를 더 쉽게 이해하고 해석할 수 있게 만듭니다.


Binning 사용의 단점:
정보 손실: 데이터를 구간으로 나누면 원래 데이터의 상세한 정보가 일부 손실될 수 있습니다.
임의성: Binning 과정에서 구간을 어떻게 설정하느냐에 따라 결과가 크게 달라질 수 있으며, 이는 때로 분석의 임의성을 증가시킵니다.


Binning은 특정 상황과 데이터 유형에 매우 유용할 수 있지만, 항상 최선의 방법은 아닙니다. 데이터의 복잡성과 모델의 정교함이 증가함에 따라, 머신 러닝 모델은 종종 binning 없이도 원 데이터에서 복잡한 패턴을 학습할 수 있습니다. 

 

---

 

Binning(데이터 구간화) 후에 데이터를 모델에 입력하기 위해 사용하는 인코딩 방식은 주로 두 가지 중 하나입니다:

레이블 인코딩(Label Encoding) 또는 원핫 인코딩(One-Hot Encoding)

레이블 인코딩
방식: 각 구간에 고유한 정수 값을 할당합니다.
적용: 레이블 인코딩은 구간이 순서를 가지고 있을 때 유용합니다. 예를 들어, '낮음', '중간', '높음'과 같은 순서가 의미를 가질 때 적합합니다.
장단점: 레이블 인코딩은 구간 간의 순서 관계를 유지하지만, 모델이 숫자의 크기나 순서에 의미를 부여할 위험이 있습니다.


원핫 인코딩
방식: 각 구간을 독립된 열로 변환하고, 해당 구간에 속하는 데이터에는 1을, 그렇지 않은 데이터에는 0을 할당합니다.
적용: 구간 간에 순서가 중요하지 않거나, 모델이 구간 간의 순서를 고려하지 않게 하고 싶을 때 적합합니다.
장단점: 원핫 인코딩은 구간 간의 순서나 중요도를 부여하지 않지만, 차원의 증가와 데이터의 희소성 문제를 야기할 수 있습니다.
결론
데이터의 성격과 모델의 종류에 따라 선택: 데이터에서 구간의 순서가 중요하고, 순서대로의 관계가 모델에 반영되어야 한다면 레이블 인코딩이 적합할 수 있습니다. 반면, 구간 간의 순서가 중요하지 않거나 모델이 순서를 고려하지 않아야 할 때는 원핫 인코딩이 더 적합할 수 있습니다.
모델의 요구사항 고려: 일부 모델들은 원핫 인코딩된 데이터에 대해 더 잘 작동할 수 있으며, 다른 모델들은 레이블 인코딩된 데이터에서 더 나은 성능을 보일 수 있습니다.
따라서, binning 후에 어떤 인코딩 방식을 사용할지 결정하기 위해서는 데이터의 특성과 분석 목적을 명확히 이해하는 것이 중요합니다.

반응형

'AI, ML > ML' 카테고리의 다른 글

cardinality  (1) 2024.01.07
dense feature vs sparse feature  (0) 2024.01.07
디시전트리기반 코드 실습  (0) 2023.10.16
그레디언트 부스팅 (Gradient Boosting)  (0) 2023.10.15
랜덤 포레스트(random forest)  (1) 2023.10.15

아래 코드는 여기서 확인가능하다.

 

data는 sklearn에서 제공하는 wine data를 사용(178개 밖에 안되긴 한다)

import pandas as pd
from sklearn.datasets import load_wine
# 와인 데이터셋 로드
wine = load_wine(as_frame=True)
df = wine.data
# data 첫 5행 출력
print(df.head())
df = wine.target
# 정답 레이블 첫 5행 출력
print(df.head())


//출력
   alcohol  malic_acid   ash  alcalinity_of_ash  magnesium  total_phenols  flavanoids  nonflavanoid_phenols  proanthocyanins  color_intensity   hue  od280/od315_of_diluted_wines  proline
0    14.23        1.71  2.43               15.6      127.0           2.80        3.06                  0.28             2.29             5.64  1.04                          3.92   1065.0
1    13.20        1.78  2.14               11.2      100.0           2.65        2.76                  0.26             1.28             4.38  1.05                          3.40   1050.0
2    13.16        2.36  2.67               18.6      101.0           2.80        3.24                  0.30             2.81             5.68  1.03                          3.17   1185.0
3    14.37        1.95  2.50               16.8      113.0           3.85        3.49                  0.24             2.18             7.80  0.86                          3.45   1480.0
4    13.24        2.59  2.87               21.0      118.0           2.80        2.69                  0.39             1.82             4.32  1.04                          2.93    735.0
0    0
1    0
2    0
3    0
4    0
Name: target, dtype: int64

정답레이블은 0, 1, 2로 서로다른 와인 재배자를 뜻함

 

다음 코드를 통해 간단히 디시전트리, 랜덤포레스트, xgboost의 성능을 비교(교차검증 사용)

from sklearn.datasets import load_wine
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
import xgboost as xgb
import numpy as np

# 데이터 로딩
data = load_wine()
X, y = data.data, data.target

# 디시전 트리 모델 생성
dt = DecisionTreeClassifier()

# 랜덤 포레스트 모델 생성
rf = RandomForestClassifier()

# XGBoost 모델 생성
xg_cls = xgb.XGBClassifier()

# 교차 검증 수행 (5-fold CV)
cv_scores_dt = cross_val_score(dt, X, y, cv=5)
cv_scores_rf = cross_val_score(rf, X, y, cv=5)
cv_scores_xgb = cross_val_score(xg_cls, X, y, cv=5)

# 평균 정확도 출력
print(f'Decision Tree CV Accuracy: {np.mean(cv_scores_dt):.2f}')
print(f'Random Forest CV Accuracy: {np.mean(cv_scores_rf):.2f}')
print(f'XGBoost CV Accuracy: {np.mean(cv_scores_xgb):.2f}')

출력

$ python wine_test.py
Decision Tree CV Accuracy: 0.87
Random Forest CV Accuracy: 0.97
XGBoost CV Accuracy: 0.95

 

반응형

'AI, ML > ML' 카테고리의 다른 글

dense feature vs sparse feature  (0) 2024.01.07
binning  (0) 2023.12.28
그레디언트 부스팅 (Gradient Boosting)  (0) 2023.10.15
랜덤 포레스트(random forest)  (1) 2023.10.15
윈도우 환경에서 ML환경 구축  (0) 2022.03.09

먼저 디시전트리랜덤포레스트를 보고오자.

비슷한 글을 여기서도 작성한 적 있다.

랜덤포레스트와의 차이점을 통해 그레디언트 부스팅의 특징을 파악해보자.

 

랜덤 포레스트와 그래디언트 부스팅은 둘 다 트리 기반의 앙상블 학습 방법이지만, 
학습 방식과 특징에 있어서 다음과 같은 차이점이 있다.

앙상블 방식:
랜덤 포레스트는 배깅(bagging)이라는 앙상블 방식을 사용.

  • 여러 개의 결정 트리를 독립적으로 학습시키고, 그 예측을 집계하여 최종 예측을 생성.

그래디언트 부스팅은 부스팅(boosting)이라는 앙상블 방식을 사용.

  • 단 한개의 시드 트리로 부터, 이전 트리의 오류를 줄이는 방향으로 학습되며, 이는 순차적인 과정.

 

과적합 방지:

랜덤 포레스트는 트리의 무작위성으로 인해 자연스럽게 과적합을 방지합니다.
그래디언트 부스팅은 규제(Regularization) 기능을 제공하여 과적합을 방지.

 

성능:
그래디언트 부스팅은 일반적으로 랜덤 포레스트보다 더 높은 예측 성능을 제공


랜덤 포레스트는 병렬 학습이 가능하므로 큰 데이터셋에 대해 빠르게 학습할 수 있습니다.
그래디언트 부스팅은 순차적인 학습 방식을 사용하므로 랜덤 포레스트보다 학습 속도가 느릴 수 있다.

 

XGBoost:

그래디언트 부스팅과 XGBoost는 기본적으로 같은 앙상블 학습 방법을 사용하지만, 

XGBoost에는 이런저런 최적화 기능이 포함되어 있음

반응형

'AI, ML > ML' 카테고리의 다른 글

binning  (0) 2023.12.28
디시전트리기반 코드 실습  (0) 2023.10.16
랜덤 포레스트(random forest)  (1) 2023.10.15
윈도우 환경에서 ML환경 구축  (0) 2022.03.09
케라스(Keras)  (0) 2020.04.13

먼저 디시전트리를 보고 오자.

 

개요

랜덤 포레스트(Random Forest)는 앙상블 학습 방법의 일종으로, 여러 개의 결정 트리를 학습시키고 그들의 예측을 결합하여 작동. 이 방식은 개별 트리의 예측의 정확도를 향상시키며, 과적합을 방지할 수 있다.

 

단계1. 부트스트랩 샘플링 (Bootstrap Sampling):

랜덤 포레스트는 각 트리를 학습시키기 위해 부트스트랩 샘플을 생성.

(Bootstrap"은 통계학에서 무작위로 샘플을 복원 추출하는 방법을 의미)

 

배깅의 기본 아이디어

부트스트랩 샘플은 원본 데이터 세트에서 중복을 허용하여 무작위로 선택된 샘플로 구성되며, 데이터개수는 원본의 크기를 유지.

 

부트스트랩이란 용어에 대해서는 다음을 참고하자.

"Bootstrapping"이라는 용어는 오래된 서양 표현 "to pull oneself up by one's bootstraps"에서 비롯되었습니다. 이 표현은 불가능한 일을 수행하려는 노력을 의미하며, 원래는 물리적으로 자신의 부츠 끈(bootstraps)을 당겨서 자신을 공중에 띄우는 것이 불가능하다는 것을 나타내기 위해 사용되었습니다. 하지만 시간이 지나면서, 이 표현은 더 긍정적이고 상징적인 의미로 발전하게 되었습니다. 이제 "to pull oneself up by one's bootstraps"는 개인이 자신의 노력과 자원으로 어려운 상황을 극복하고 성공을 달성할 수 있음을 나타냅니다. 이는 무엇인가를 시작하거나 개선하기 위해 외부 도움 없이 자신의 능력과 자원을 사용하는 것을 의미합니다.웹 개발과 통계학에서 "Bootstrapping"의 사용은 이러한 개념을 반영합니다:

웹 개발의 부트스트랩:웹 개발 분야에서 부트스트랩은 개발자가 기본 구조와 디자인을 빠르게 설정하고, 프로젝트를 더 빠르게 시작하고 진행할 수 있도록 돕는 프레임워크입니다. 이는 개발자가 외부 디자인 팀이나 추가 자원 없이도 효과적인 웹사이트를 구축할 수 있게 해줍니다.

통계학의 부트스트랩 샘플링:통계학에서 부트스트랩 샘플링은 원본 데이터셋만을 사용하여 통계적 추정을 수행하는 방법을 제공합니다. 이는 외부 데이터 또는 추가 정보 없이도 원본 데이터셋의 특성을 이해하고 분석할 수 있게 해줍니다.

이런 방식으로, "Bootstrapping"은 독립성과 자립성의 중요성을 강조하며, 제한된 자원으로도 무언가를 성취할 수 있음을 상징합니다.

 

단계2. 특성 무작위 선택:

데이터만 무작위 샘플링하는게 아니라, 날씨/온도/습도등 각 노드에서 분할을 수행하는 특성도 일부 특성만을 무작위로 선택하여 사용. 이 방식은 트리의 다양성을 증가시키며, 과적합을 방지

 

단계3. 단계1,2를 통해 생성된 다수의 결정 트리를 개별 학습

랜덤 포레스트는 위의 두 과정을 통해 여러 개의 결정 트리를 독립적으로 학습.

각 트리는 약간 다른 부트스트랩 샘플과 약간 다른 특성 집합을 사용하여 학습됨.

 

단계4. 앙상블을 통한 집계:

분류 문제의 경우, 랜덤 포레스트는 각 트리의 예측을 모아서 투표를 통해 최종 클래스 레이블을 결정.
회귀 문제의 경우, 랜덤 포레스트는 각 트리의 예측을 평균내어 최종 예측을 생성.

 

단계5. 아웃 오브 백 (Out of Bag) 평가:

중복을 허용하는 부트스르랩 샘플링의 특성에 의해 피전홀 원칙에 따라 일부 샘플은 특정 개별 트리 학습과정에서 제외된다(위의 예시에서는 #2번 샘플)
이러한 샘플을 사용하여 트리의 성능을 평가하고, 랜덤 포레스트의 전반적인 성능을 추정할 수 있다.

학습에 사용되지 않은 아웃 오브 백 샘플을 사용하여 각 트리의 성능을 평가하고, 이는 각 트리에 대한 오류율을 측정하는 데 사용될 수 있다.
랜덤 포레스트 평가: 모든 트리의 아웃 오브 백 오류율을 평균하여 랜덤 포레스트의 전반적인 아웃 오브 백 오류율을 계산. 이는 랜덤 포레스트 모델의 전반적인 성능을 추정하는 데 사용될 수 있다.

 

단계6. 일반적인 평가

랜덤 포레스트의 평가에 있어서 아웃 오브 백(Out of Bag, OOB) 평가는 선택적인 방법.
이는 별도의 검증 데이터셋을 필요로 하지 않으므로 유용할 수 있지만, 이는 랜덤 포레스트의 성능을 평가하는 유일한 방법은 아님. 실제로는, 다음과 같은 다양한 평가 방법들이 널리 사용됨

분할 검증 (Holdout Validation):
데이터를 학습 세트와 검증 세트로 분할하고, 학습 세트로 모델을 학습시킨 후 검증 세트로 모델의 성능을 평가.


교차 검증 (Cross-Validation):
데이터를 여러 개의 폴드로 분할하고, 각 폴드를 검증 세트로 사용하여 모델의 성능을 평가.

  • K번의 반복을 수행.
  • 각 반복에서 하나의 폴드를 검증 세트로 선택하고, 나머지  K−1개의 폴드를 학습 세트로 사용
  • 모델을 학습 세트로 학습시키고, 검증 세트로 모델의 성능을 평가.

이 방법은 모델의 성능을 보다 안정적으로 평가할 수 있음


부트스트랩 검증 (Bootstrap Validation):
여러 번의 부트스트랩 샘플을 생성하고, 각 샘플로 모델을 학습 및 검증하여 모델의 성능을 평가.


반응형

'AI, ML > ML' 카테고리의 다른 글

디시전트리기반 코드 실습  (0) 2023.10.16
그레디언트 부스팅 (Gradient Boosting)  (0) 2023.10.15
윈도우 환경에서 ML환경 구축  (0) 2022.03.09
케라스(Keras)  (0) 2020.04.13
Bayesian Online Changepoint Detection 논문리딩  (0) 2019.08.21

colab 중심으로 해보려고 하다가, GPU환경이 항상확보되는게 아니라 비용지불이 필요해서, 로컬에 환경을 구축해보려고 한다.

 

여기를 보고 하나씩 따라하며 환경 구축 진행 중

 

https://developer.nvidia.com/cuda-gpus 여기에 내 GPU인 1660 super가 나오지는 않지만 구글링 결과 7.5랑 호환 되는거 같다.

여기서 쿠다툴킷 11버전 다운로드 받았다

 

결과적으로 tensorflow는 gpu버전으로 잘 안됐고 pytorch는 됐다.(필요했던건 pytorch라 OK)

 

bash실행이 필요했는데, 윈도우라 안된건 windows10에 포함된 ubuntu를 설치해서 해결했다.

 

반응형

'AI, ML > ML' 카테고리의 다른 글

그레디언트 부스팅 (Gradient Boosting)  (0) 2023.10.15
랜덤 포레스트(random forest)  (1) 2023.10.15
케라스(Keras)  (0) 2020.04.13
Bayesian Online Changepoint Detection 논문리딩  (0) 2019.08.21
부스팅(boosting)  (0) 2019.05.28

+ Recent posts