결손치 의 처리 방법 을 정리했다
결손치의 발생 메커니즘에 대해 다음과 같이 정리한다.상세한 상황은 생략할 수 있지만 세 종류로 나눌 수 있다.
손실치에 대한 처리 방법
이번에는 타이타닉호의 데이터를 대상으로 다양한 결손치 보충 방법을 시도해 보려고 한다.
우선 데이터를 얻어 타이타닉 호의 데이터를 보자.
# ライブラリーのインポート
import pandas as pd
import numpy as np
import random as rnd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.ensemble import GradientBoostingRegressor
import warnings
warnings.simplefilter('ignore')
# データの読み込み(タイタニックデータ)
df = pd.read_csv('../data/train.csv')
df.head()
다음은 데이터의 기본 정보를 확인합니다.
# データの基本情報を確認
df.info()
Age, Cabin, Embered에 손실이 있다는 것을 알고 있습니다.
상술한 말은 몇 개의 결손치가 있는지 모르기 때문에 다시 한 번 결손치를 확인한다.
# 欠損値の確認
df.isnull().sum()
부족한 값을 확인하는 처리 방법을 위해 이번에는 필요하지 않은 열을 삭제하고, 부족한 값을 확인하기 위해 열 수를 줄일 것입니다.
#性別の数値変換
df.loc[(df['Sex'] == 'male'), 'Sex'] = 0
df.loc[(df['Sex'] == 'female'), 'Sex'] = 1
# 不要なカラムの削除
df = df.drop(['Name',
'Cabin',
'Ticket',
'SibSp',
'Parch',
'Embarked',
'Fare'],
axis=1)
df.head(10)
여섯 번째 행의 Age가 NaN에서 손상되었습니다.
나는 아래의 각양각색의 손실치 처리 방법을 시험해 보고 싶다.
목록 방법
값이 없는 샘플을 삭제하는 방법입니다.
df_listwise = df.dropna()
df_listwise.head(10)
방금 존재했던 여섯 번째 줄의 파손 샘플을 삭제했다.
단일 대입법
다음은 결손치 부분에 값을 대입하는 방법을 시험해 봅시다.
평균치 보완
평균치로 결손치를 보충하다.
mean = df.mean()
df_mean = df.fillna(mean)
df_mean.head(10)
여섯 번째 행의 Age
29.699118
가 완료되었습니다.이것은 Age의 평균치이며, 평균치로 모든 결손치를 보충한다.중치 보완
다음은 중치로 결손치를 보충한다.
median = df.median()
df_median = df.fillna(median)
df_median.head(10)
여섯 번째 행의 Age
28.0
가 완료되었습니다.이것은 Age의 중앙값이며, 모든 결손값은 중앙값으로 보충한다.회귀 대입법(GBDT)
다음은 결손 값이 있는 열(이번에는 Age)을 목표 변수로 삼아 회귀 모델을 구축하여 결손 값을 보충하는 방법이다.
df_master = df.dropna()
df_miss = df[df.isnull().any(axis=1)]
model = GradientBoostingRegressor().fit(df_master.drop(["Age","Survived"], axis=1), df_master["Age"])
df_miss["Age"] = model.predict(df_miss.drop(["Age","Survived"], axis=1))
df_GBDT = pd.concat([df_master, df_miss]).sort_index()
df_GBDT.head(10)
여섯 번째 행의 Age
30.534716
가 완료되었습니다.이는 Age 목적 변수로, 변수가'Passengerld, Pclass, Sex'를 사용해 GBDT에서 회귀 모델을 구축한 뒤 6행 Age를 예측한 결과 누락값을 보완했다는 설명이다.IterativeImputer를 통한 대입법
여기서부터 총서를 사용한 결손치 보완 방법을 정리한다.처음에는 다변수 데이터 집합을 대입하는 데 쓰였다.
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
imp = IterativeImputer(max_iter=10, random_state=1)
df_IterativeImputer = pd.DataFrame(imp.fit_transform(df))
df_IterativeImputer.columns = df.columns
df_IterativeImputer.head(10)
여섯 번째 행의 Age
26.181867
가 완료되었습니다.상세한 보전 논리에 관해서 이번 생략은KNNImputer의 대입법
다음은 K인접역법에 따라 결손치를 보충하는 방법이다.
from missingpy import KNNImputer
imp = KNNImputer(n_neighbors=2, weights='uniform')
df_KNN = pd.DataFrame(imp.fit_transform(df))
df_KNN.columns = df.columns
df_KNN.head(10)
여섯 번째 행의 Age
18.5
가 완료되었습니다.이번에 상세한 보완논리를 생략했지만 K인접역법을 활용해 결손치 보완을 했다.MissForest를 통한 대입법(랜덤 숲)
마지막으로 무작위 삼림을 이용하여 결손치를 보충하는 방법이다.
from missingpy import MissForest
imp = MissForest(max_iter=10)
df_MF = pd.DataFrame(imp.fit_transform(df))
df_MF.columns = df.columns
df_MF.head(10)
여섯 번째 행의 Age
24.9
가 완료되었습니다.이번에는 상세한 보완 논리를 생략했지만 랜덤 숲을 이용해 결손치를 보완했다.최후
끝까지 읽어주셔서 감사합니다.
손실치에 대한 처리 방법은 일부분으로 정리해 봤습니다.결손치 보완 방법에 따라 결과는 완전히 다르다.실제 업무에서 손실치를 처리할 때 발생 메커니즘을 확인한 다음에 적당한 방법으로 손실치를 처리해야 한다.
수정 요청이 있으면 연락 주세요.
Reference
이 문제에 관하여(결손치 의 처리 방법 을 정리했다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/DS27/items/1a79220f982e0094f1fc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)