from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import mean_squared_error , mean_absolute_error , mean_absolute_percentage_error ,r2_score
from sklearn.metrics import accuracy_score, recall_score, roc_auc_score, precision_score
import numpy as np
import warnings
warnings.filterwarnings("ignore")
데이터 분포, 결측치 확인, 이상치 확인 → 스케일링
print(x_train.shape, x_test.shape)
print(x_train.info(), x_test.info())
print(x_train.value_counts())
display(x_test.value_counts())
print(x_train.isnull().sum().sum(), x_test.isnull().sum().sum())
print(x_train.describe(include='O'), x_test.describe(include='O'))
test에 있는 데이터가 train 데이터에는 없는 경우도 있기 때문에 object 타입 값을 직접 확인해주어야 한다.
a = set(train['A'])
b = set(train['B'])
print("학습 데이터에만 있는 것 ", a - b)
print("적합 데이터에만 있는 것 ", b - a)
일단 ID만 날리고, 인코딩해버리면 데이터 합쳤을 때 다른 데이터로 학습되어버리니까 concat
먼저 진행
pd.concat([train, test])
표준편차 / 평균
age | bmi | children | charges | |
---|---|---|---|---|
count | 1338.000000 | 1338.000000 | 1338.000000 | 1338.000000 |
mean | 39.207025 | 30.663397 | 1.094918 | 13270.422265 |
std | 14.049960 | 6.098187 | 1.205493 | 12110.011237 |
min | 18.000000 | 15.960000 | 0.000000 | 1121.873900 |
25% | 27.000000 | 26.296250 | 0.000000 | 4740.287150 |
50% | 39.000000 | 30.400000 | 1.000000 | 9382.033000 |
75% | 51.000000 | 34.693750 | 2.000000 | 16639.912515 |
max | 64.000000 | 53.130000 | 5.000000 | 63770.428010 |
describe 메소드는 기본적으로 숫자형 데이터에 대해서만 작동합니다. 살펴보니 다음과 같은 특징들이 보입니다.
자녀의 수(children)의 표준편차가 평균과 비슷한 수준입니다. 이는 feature의 분포가 매우 넓게 퍼져 있음을 의미합니다. 아마 히스토그램을 그려봐야 알겠지만 차후에 분포를 모아주는 작업이 필요할 수도 있습니다.
→ 평균 대비 표준편차가 100%의 값으로 분포를 가지므로 평균에서 멀리 퍼져있다는 뜻
여기서는 보험료(charges)가 종속변수이기 때문에 해당 사항이 없지만, 만일 독립변수(feature)라고 가정한다면,
보험료와 다른 feqture들에 대해서 숫자 단위 차이가 극심하게 나는 것을 알 수 있습니다. age와 bmi는 숫자가 커봤자 두 자리인데, 보험료는 만 단위까지 올라갑니다. 이렇게 feature 사이의 단위 차이가 클 경우, 단위가 큰 feature의 영향을 지나치게 많이 받을 가능성이 있고, 따라서 학습이 제대로 이루어지지 않을 수 있습니다.
따라서 보통 단위 차이가 큰 feature들은 단위를 맞춰주는 작업(Scaling)이 필요합니다.
물론, 앞서도 말했듯이 여기서는 보험료가 종속변수이기 때문에 scaling을 해주지 않겠습니다.
숫자형 변수들에 대해 df.corr()