- 결측치 처리하기

scikit-learn으로 배우는 지도 학습

George Boorman

Core Curriculum Manager, DataCamp

결측치

  • 특정 행의 어떤 특성에 대한 값이 없는 상태

  • 다음과 같은 이유로 발생:

    • 관측이 이루어지지 않았을 수 있음
    • 데이터가 손상되었을 수 있음
  • 따라서 결측치를 처리해야 함

scikit-learn으로 배우는 지도 학습

음악 데이터세트

print(music_df.isna().sum().sort_values())
genre                 8
popularity           31
loudness             44
liveness             46
tempo                46
speechiness          59
duration_ms          91
instrumentalness     91
danceability        143
valence             143
acousticness        200
energy              200
dtype: int64
scikit-learn으로 배우는 지도 학습

결측치 제거하기

music_df = music_df.dropna(subset=["genre", "popularity", "loudness", "liveness", "tempo"])

print(music_df.isna().sum().sort_values())
popularity            0
liveness              0
loudness              0
tempo                 0
genre                 0
duration_ms          29
instrumentalness     29
speechiness          53
danceability        127
valence             127
acousticness        178
energy              178
dtype: int64
scikit-learn으로 배우는 지도 학습

결측값 대체하기

  • Imputation - 도메인 지식을 활용해 결측치를 합리적으로 추정한 값으로 대체
  • 평균값을 사용하는 것이 일반적
  • 중앙값 또는 다른 값을 사용할 수도 있음
  • 범주형 값에는 일반적으로 가장 자주 나타나는 값, 즉 최빈값을 사용
scikit-learn으로 배우는 지도 학습

scikit-learn으로 결측값 대체

from sklearn.impute import SimpleImputer

X_cat = music_df["genre"].values.reshape(-1, 1) X_num = music_df.drop(["genre", "popularity"], axis=1).values y = music_df["popularity"].values
X_train_cat, X_test_cat, y_train, y_test = train_test_split(X_cat, y, test_size=0.2, random_state=12)
X_train_num, X_test_num, y_train, y_test = train_test_split(X_num, y, test_size=0.2, random_state=12)
imp_cat = SimpleImputer(strategy="most_frequent")
X_train_cat = imp_cat.fit_transform(X_train_cat)
X_test_cat = imp_cat.transform(X_test_cat)
scikit-learn으로 배우는 지도 학습

scikit-learn으로 결측값 대체

imp_num = SimpleImputer()

X_train_num = imp_num.fit_transform(X_train_num)
X_test_num = imp_num.transform(X_test_num)
X_train = np.append(X_train_num, X_train_cat, axis=1)
X_test = np.append(X_test_num, X_test_cat, axis=1)
  • imputer는 transformer의 한 종류임
scikit-learn으로 배우는 지도 학습

파이프라인 내 결측값 대체

from sklearn.pipeline import Pipeline

music_df = music_df.dropna(subset=["genre", "popularity", "loudness", "liveness", "tempo"])
music_df["genre"] = np.where(music_df["genre"] == "Rock", 1, 0)
X = music_df.drop("genre", axis=1).values y = music_df["genre"].values
scikit-learn으로 배우는 지도 학습

파이프라인 내 결측값 대체

steps = [("imputation", SimpleImputer()),
         ("logistic_regression", LogisticRegression())]

pipeline = Pipeline(steps)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
pipeline.fit(X_train, y_train)
pipeline.score(X_test, y_test)
0.7593582887700535
scikit-learn으로 배우는 지도 학습

연습해 봅시다!

scikit-learn으로 배우는 지도 학습

Preparing Video For Download...