결손치 의 처리 방법 을 정리했다
결손치의 발생 메커니즘에 대해 다음과 같이 정리한다.상세한 상황은 생략할 수 있지만 세 종류로 나눌 수 있다.
손실치에 대한 처리 방법
이번에는 타이타닉호의 데이터를 대상으로 다양한 결손치 보충 방법을 시도해 보려고 한다.
우선 데이터를 얻어 타이타닉 호의 데이터를 보자.
# ライブラリーのインポート
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.)