ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 지도학습 | 알고리즘 - 데이터셋
    Machine Learning/ML with Python Library 2024. 2. 4. 19:28

    Import

    지도학습에 사용할 데이터셋을 먼저 준비해보자. 우선은 이진 분류(Binary Classification)을 위한 데이터를 만들어보았다. 데이터를 만들고 시각화 하기 위해서, 먼저 아래와 같은 패키지를 설치하고 import 해주었다. Google Colab에는 mglearn이 자동으로 설치되어있지 않아서, pip를 이용해서 설치해주었다.

     

    !pip install mglearn
    import mglearn
    import matplotlib.pyplot as plt

     

     

    Forge - Classification Dataset

    이제 두개의 특성을 가진 forge 데이터셋을 만들어보자. 우리가 원하는 이진 분류 데이터셋이다. 아래와 같은 코드로 만들어 볼 수 있다.

    # Create dataset that is binary classification dataset
    x, y = mglearn.datasets.make_forge()
    print(x, y)

    x, y 를 프린트 해봤더니 아래와 같은 숫자들이 보였다. x는 사이즈 2의 2D 어레이였는데, 2개의 Feature값들이 들어가있고, y에는 해당 값들이 True(1)인지 False(2)인지를 판단해주는 target points들이 모여있었다.

    x
    [[ 9.96346605 4.59676542] [11.0329545 -0.16816717] [11.54155807 5.21116083] [ 8.69289001 1.54322016] [ 8.1062269 4.28695977] [ 8.30988863 4.80623966] [11.93027136 4.64866327] [ 9.67284681 -0.20283165] [ 8.34810316 5.13415623] [ 8.67494727 4.47573059] [ 9.17748385 5.09283177] [10.24028948 2.45544401] [ 8.68937095 1.48709629] [ 8.92229526 -0.63993225] [ 9.49123469 4.33224792] [ 9.25694192 5.13284858] [ 7.99815287 4.8525051 ] [ 8.18378052 1.29564214] [ 8.7337095 2.49162431] [ 9.32298256 5.09840649] [10.06393839 0.99078055] [ 9.50048972 -0.26430318] [ 8.34468785 1.63824349] [ 9.50169345 1.93824624] [ 9.15072323 5.49832246] [11.563957 1.3389402 ]]

    y
    [1 0 1 0 0 1 1 0 1 1 1 1 0 0 1 1 1 0 0 1 0 0 0 0 1 0]

     

    이제 이 값들을 Scatter Chart에 뿌려보자.

    # Create scatter plot
    mglearn.discrete_scatter(x[:, 0], x[:, 1], y)
    plt.legend(["CLASS 0", "CLASS 1"], loc=4)
    plt.xlabel("Feature 1")
    plt.ylabel("Feature 2")
    print("x.shape:", x.shape)

    차트를 만들고, x에서 첫번째 값들, 2번째 값들을 이용해서 위치를 정했다. 또 Y값을 이용해서 클래스를 0 또는 1로 지정해주었다. label도 지정해주었다.

     

    Shape 함수의 값을 보면 아래와 같다.

    x.shape: (26, 2)

     

    26개의 데이터 포인트가 포함되어 있고, 2개의 특성을 가진다. 

     

     

    Wave - Regression Dataset

    회귀(Regression)를 위해서는 인위적으로 wave 데이터셋을 사용한다. wave 데이터셋은 input특성 하나와 모델링할 target값을 가진다. 아래와 같이 데이터를 생성할 수 있다. n_sample을 40으로 지정해서, 40개의 데이터를 생성했다.

    # Regression Dataset
    rx, ry = mglearn.datasets.make_wave(n_samples=40)
    print(rx, ry)

     

    rx
    [[-0.75275929] [ 2.70428584] [ 1.39196365] [ 0.59195091] [-2.06388816] [-2.06403288] [-2.65149833] [ 2.19705687] [ 0.60669007] [ 1.24843547] [-2.87649303] [ 2.81945911] [ 1.99465584] [-1.72596534] [-1.9090502 ] [-1.89957294] [-1.17454654] [ 0.14853859] [-0.40832989] [-1.25262516] [ 0.67111737] [-2.16303684] [-1.24713211] [-0.80182894] [-0.26358009] [ 1.71105577] [-1.80195731] [ 0.08540663] [ 0.55448741] [-2.72129752] [ 0.64526911] [-1.97685526] [-2.60969044] [ 2.69331322] [ 2.7937922 ] [ 1.85038409] [-1.17231738] [-2.41396732] [ 1.10539816] [-0.35908504]]

    ry
    [-0.44822073 0.33122576 0.77932073 0.03497884 -1.38773632 -2.47196233 -1.52730805 1.49417157 1.00032374 0.22956153 -1.05979555 0.7789638 0.75418806 -1.51369739 -1.67303415 -0.90496988 0.08448544 -0.52734666 -0.54114599 -0.3409073 0.21778193 -1.12469096 0.37299129 0.09756349 -0.98618122 0.96695428 -1.13455014 0.69798591 0.43655826 -0.95652133 0.03527881 -2.08581717 -0.47411033 1.53708251 0.86893293 1.87664889 0.0945257 -1.41502356 0.25438895 0.09398858]

     

     

    이제 생성한 Feature데이터와 Target 데이터를 Scatter Plot에 그려보자. 역시 matplotlib을 사용한다.

    plt.plot(rx, ry, 'o')
    plt.ylim(-3, 3)
    plt.xlabel("Feature")
    plt.ylabel("Target")

     

     

    2개 이상의 특성은 2차원에 표현하기 어렵기 때문에, 손쉽게 시각화하기 위해서 간단한 저차원 데이터셋을 생성했다. 단, 특성이 적은 데이터셋(저차원 데이터셋)에서 얻은 직관이 특성이 많은 데이터셋(고차원 데이터셋)에서 그대로 유지되지 않을 수 있다. 

     

    Scikit-Learn Dataset - Classfication: Cancer Data

    인위적인 소규모 데이터셋 외에, scikit-learn에 들어있는 실제 데이터셋도 두개를 사용할것이다. 하나는 유방암 종양 임상 데이터를 기록해둔 위스콘신 유방암 데이터셋(cancer)이다. 각 종양은 해롭지 않은 양성(benign)과 암 종양이기 때문에 해로운 악성(malignant)로 레이블 되어있고, 조직들의 데이터를 기반으로 해당 종양이 악성인지 양성인지 예측할 수 있도록 학습할 것이다. 이 데이터는 load_breast_cancer 함수를 이용해서 불러올 수 있다.

    from sklearn.datasets import load_breast_cancer
    cancer = load_breast_cancer()
    print("cancer.keys():\n", cancer.keys())
    cancer.keys(): dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename', 'data_module'])

     

    Caner Data를 불러오고 key를 프린트했다. 이제 데이터의 형태를 살펴보자.

     

    print("Cander Data Shape:", cancer.data.shape)
    Cander Data Shape: (569, 30)

     

    암 데이터의 형태를 살펴보니, 569개의 데이터가 있었고, 30가지 특성을 갖고 있다. 그러면 이 샘플의 악성/양성 샘플은 몇개씩일까?

     

    import numpy as np
    
    print("Sample Count per Class:\n",
          {n: v for n, v in zip(cancer.target_names, np.bincount(cancer.target))})
    Sample Count per Class: {'malignant': 212, 'benign': 357}

     

    악성 212개, 양성 357를 포함한 샘플임을 알 수 있다. 마지막으로 30개의 feature들이 어떤것인지 feature_name을 살펴보자.

     

    print("Feature Names:\n", cancer.feature_names)
    Feature Names: ['mean radius' 'mean texture' 'mean perimeter' 'mean area' 'mean smoothness' 'mean compactness' 'mean concavity' 'mean concave points' 'mean symmetry' 'mean fractal dimension' 'radius error' 'texture error' 'perimeter error' 'area error' 'smoothness error' 'compactness error' 'concavity error' 'concave points error' 'symmetry error' 'fractal dimension error' 'worst radius' 'worst texture' 'worst perimeter' 'worst area' 'worst smoothness' 'worst compactness' 'worst concavity' 'worst concave points' 'worst symmetry' 'worst fractal dimension']

     

    반지름부터 평균 넓이, 감촉 등 많은 값들이 포함되어있다. 더 자세한 정보는 아래 코드로 확인 가능하다.

    cancer.DESCR

     

     

    Scikit-Learn Dataset - Regression: Boston Housing

    회귀(Regression)분석용 데이터셋으로는 보스턴 주택 가격 데이터셋을 사용한다. 이 데이터셋으로 범죄율, 찰스강 인접도, 고속도로 접근성 등의 정보를 이용해서 1970년대 보스턴 주변 주택 평균 가격을 예측할것이다. 이 데이터셋을 살펴보자.

    import pandas as pd
    
    data_url = "http://lib.stat.cmu.edu/datasets/boston"
    raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
    data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
    target = raw_df.values[1::2, 2]
    print("Data Shape:", data.shape)
    Data Shape: (506, 13)

     

    cmu 라이브러리에서 데이터를 받아와서 parsing을 해주었다. "Boston Housing Dataset"을 인터넷에서 불러와서 데이터를 처리하는 과정이다. 첫 번째 줄은 데이터셋의 URL을 하고, 그 다음 pd.read_csv 함수를 사용하여 데이터를 불러오는데, 여기서 sep="\s+"는 데이터가 공백으로 구분되어 있음을 의미하고, skiprows=22는 처음 22줄을 건너뛰는 것이다(이는 파일의 헤더나 설명 부분을 건너뛰기 위함일 가능성이 높습다). header=None은 데이터에 헤더(열 이름)가 없음을 의미한다. np.hstack은 두 개의 배열을 가로로(수평으로) 합치는데 사용된다. 여기서 raw_df.values[::2, :]와 raw_df.values[1::2, :2]는 슬라이싱을 통해 데이터를 분할한다. ::2는 모든 행을 두 칸씩 건너뛰며 선택하고, 1::2는 두 번째 행부터 시작해 두 칸씩 건너뛰며 선택한다. 마지막으로 target 변수는 raw_df의 두 번째 열에서 두 칸씩 건너뛴 모든 행을 선택하여 지정한다. print("Data Shape:", data.shape)는 처리된 데이터의 형태를 출력한다.

     

    이 데이터셋에서는 13개의 입력 특성이 있는데, 우리는 이 특성 뿐 아니라, 특성끼리 곱하여(상호작용이라고 부른다) 의도적으로 확장해서 사용할것이다. 범죄율과 고속도로 접근성의 개별 특성들 뿐만 아니라, 그 두 값을 곱한 값도 특성으로 생각한다는 뜻이다. 이렇게 의도적으로 특성을 유도해내는 것을 특성공학(feature engineering)이라고 하며, 4장에서 다루도록 하겠다. 이렇게 유도된 데이터셋을 가져와서 사용하겠다.

    bx, by = mglearn.datasets.load_extended_boston()
    print(bx.shape)
    (506, 104)

     

    그전과는 다르게, 샘플의 숫자는 여전히 506개이지만, 유도 및 확장된 데이터는 104개의 Feature를 갖고있다.

     

     

    Reference

    https://www.yes24.com/Product/Goods/42806875

     

    파이썬 라이브러리를 활용한 머신러닝 - 예스24

    사이킷런 핵심 개발자에게 배우는 머신러닝 이론과 구현 현업에서 머신러닝을 연구하고 인공지능 서비스를 개발하기 위해 꼭 학위를 받을 필요는 없다. 사이킷런(scikit-learn)과 같은 훌륭한 머신

    www.yes24.com

    https://colab.research.google.com/drive/1fzSiPpwbTUplw6G0PJSpGaVBWx5CEMIZ?usp=sharing

     

    _02_supervised_machine_learning.ipynb

    Colaboratory notebook

    colab.research.google.com

    https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_breast_cancer.html

     

    sklearn.datasets.load_breast_cancer

    Examples using sklearn.datasets.load_breast_cancer: Post pruning decision trees with cost complexity pruning Model-based and sequential feature selection Permutation Importance with Multicollinear ...

    scikit-learn.org

     

    댓글

Designed by Tistory.