Scikit-Learn 열 변환기

Beginner

This tutorial is from open-source community. Access the source code

소개

이 실습에서는 다양한 유형의 특징을 포함하는 데이터 세트에서 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 의 PipelineColumnTransformer를 사용하여 이를 달성할 것입니다.

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를 사용하여 단일 파이프라인에서 서로 다른 유형의 특징을 처리할 수 있었습니다.