소개
이 실습에서는 다양한 유형의 특징을 포함하는 데이터 세트에서 Scikit-Learn 의 ColumnTransformer를 사용하는 방법을 배웁니다. 이 기술은 데이터 세트에 서로 다른 특징 추출 및 처리 파이프라인이 필요한 구성 요소가 있을 때 유용합니다.
VM 팁
VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습을 위한 Jupyter Notebook에 접근합니다.
때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사를 자동화할 수 없습니다.
학습 중 문제가 발생하면 Labby 에 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.
데이터셋
20 개의 주제에 대한 뉴스그룹 게시물로 구성된 20 뉴스그룹 데이터셋을 사용할 것입니다. 이 데이터셋은 특정 날짜 이전과 이후에 게시된 메시지 기준으로 학습 및 테스트 서브셋으로 분할됩니다. 실행 시간을 단축하기 위해 2 개의 카테고리 게시물만 사용할 것입니다.
categories = ["sci.med", "sci.space"]
X_train, y_train = fetch_20newsgroups(
random_state=1,
subset="train",
categories=categories,
remove=("footers", "quotes"),
return_X_y=True,
)
X_test, y_test = fetch_20newsgroups(
random_state=1,
subset="test",
categories=categories,
remove=("footers", "quotes"),
return_X_y=True,
)
변환기 생성
데이터셋에서 특징을 추출하는 변환기를 생성할 것입니다. 데이터 변환을 수행하는 두 개의 함수를 정의한 다음, Scikit-Learn 의 FunctionTransformer를 사용하여 변환기를 생성합니다.
def subject_body_extractor(posts):
## 두 열을 가진 object dtype 배열을 생성합니다.
## 첫 번째 열 = '제목'이고 두 번째 열 = '본문'입니다.
features = np.empty(shape=(len(posts), 2), dtype=object)
for i, text in enumerate(posts):
## 임시 변수 `_` 는 '\n\n'을 저장합니다.
headers, _, body = text.partition("\n\n")
## 본문 텍스트를 두 번째 열에 저장합니다.
features[i, 1] = body
prefix = "Subject:"
sub = ""
## 'Subject:' 뒤의 텍스트를 첫 번째 열에 저장합니다.
for line in headers.split("\n"):
if line.startswith(prefix):
sub = line[len(prefix) :]
break
features[i, 0] = sub
return features
subject_body_transformer = FunctionTransformer(subject_body_extractor)
def text_stats(posts):
return [{"length": len(text), "num_sentences": text.count(".")} for text in posts]
text_stats_transformer = FunctionTransformer(text_stats)
분류 파이프라인
데이터셋에서 특징을 추출하고, 이들을 결합하여 결합된 특징 집합에 대한 분류기를 학습하는 파이프라인을 생성할 것입니다. Scikit-Learn 의 Pipeline과 ColumnTransformer를 사용하여 이를 달성할 것입니다.
pipeline = Pipeline(
[
## 제목 및 본문 추출
("subjectbody", subject_body_transformer),
## ColumnTransformer 를 사용하여 제목 및 본문 특징 결합
(
"union",
ColumnTransformer(
[
## 제목에 대한 bag-of-words (열 0)
("subject", TfidfVectorizer(min_df=50), 0),
## 본문에 대한 bag-of-words 와 차원 축소 (열 1)
(
"body_bow",
Pipeline(
[
("tfidf", TfidfVectorizer()),
("best", TruncatedSVD(n_components=50)),
]
),
1,
),
## 게시물 본문에서 텍스트 통계를 추출하는 파이프라인
(
"body_stats",
Pipeline(
[
(
"stats",
text_stats_transformer,
), ## 사전 -> 특징 행렬 변환
(
"vect",
DictVectorizer(),
), ## 사전 -> 특징 행렬 변환
]
),
1,
),
],
## 위 ColumnTransformer 특징의 가중치
transformer_weights={
"subject": 0.8,
"body_bow": 0.5,
"body_stats": 1.0,
},
),
),
## 결합된 특징에 SVC 분류기 사용
("svc", LinearSVC(dual=False)),
],
verbose=True,
)
학습 및 테스트
훈련 데이터에 파이프라인을 적용하고, 이를 사용하여 X_test에 대한 주제를 예측할 것입니다. 그런 다음 파이프라인의 성능 지표를 출력합니다.
pipeline.fit(X_train, y_train)
y_pred = pipeline.predict(X_test)
print("분류 보고서:\n\n{}".format(classification_report(y_test, y_pred)))
요약
이 실습에서는 다양한 유형의 특징을 포함하는 데이터셋에 Scikit-Learn 의 ColumnTransformer를 사용하는 방법을 배웠습니다. 데이터셋에서 특징을 추출하는 변환기를 만들고, 이를 사용하여 결합된 특징 집합에 대한 분류기를 학습했습니다. ColumnTransformer를 사용하여 단일 파이프라인에서 서로 다른 유형의 특징을 처리할 수 있었습니다.