이번 주제는 Porto serqruo safe prediction 로,
목표는 운전자가 내년에 자동차 보험 청구를 시작할 확률울 예측하는 모델을 구축 하는 것이다.
이번 필사는 Gabriel Preda님의 코드를 참고하였다.
총 3가지 포스트로 내용을 나누었고, 순서는 아래와 같다.
Porto serqruo safe prediction(Gabriel Preda) (1)
1. 데이터 분석 준비
2. 데이터 설명
3. Metadata 설명
Porto serqruo safe prediction(Gabriel Preda) (2)
4. 데이터 분석과 통계
Porto serqruo safe prediction(Gabriel Preda) (3)
5. 모델을 위한 데이터 준비
6. 모델 준비
7. 예측 모델 실행
4. 데이터 분석과 통계
1) Target 변수
plt.figure()
fig, ax = plt.subplots(figsize=(6,6))
x = trainset['target'].value_counts().index.values
y = trainset['target'].value_counts().values
# Bar plot
# target 중간값으로 내림차순
sns.barplot(ax=ax, x=x, y=y)
plt.ylabel('Number of values', fontsize=12)
plt.xlabel('Target values', fontsize=12)
plt.tick_params(axis='both', which='major', labelsize=12)
plt.show()
target value가 1인 경우는 오직 3.64%정도이다. 이것은 높은 불균형을 의미한다. 이럴 경우엔 target value 0을 언더샘플링(undersampling) 하거나, 1을 오버 샘플링(oversampling)하는 방법이 있다. 지금은 0 데이터셋이 크기 때문에 target value 0을 언더샘플링을 진행한다.
2) real features
variable = metadata[(metadata.type=='real') & (metadata.preserve)].index
trainset[variable].describe()
(pow(trainset['ps_car_12']*10,2)).head()
trainset['ps_car_15'].head()
(pow(trainset['ps_car_15'],2)).head()
sample = trainset.sample(frac=0.05)
var = ['ps_car_12', 'ps_car_15', 'target']
sample = sample[var]
sns.pairplot(sample, hue='target', palette='Set1', diag_kind='kde')
plt.show()
3) calculated features
- KDE 그래프를 통해 출력해보자.
- 커널 밀도 추정(KDE : Kernel Density Estimator) : 히스토그램 같은 분포를 분포를 곡선화하여 그려주는 것.
- R에서는 destiny 함수 사용
var = metadata[(metadata.type =='real') & (metadata.preserve)].index
i = 0
t1 = trainset.loc[trainset['target'] != 0]
t0 = trainset.loc[trainset['target'] == 0]
sns.set_style('whitegrid')
plt.figure()
fig, ax = plt.subplots(3,4,figsize=(16,12))
for feature in var :
i += 1
plt.subplot(3,4,i)
sns.kdeplot(t1[feature], bw=0.5, label="target = 1")
sns.kdeplot(t0[feature], bw=0.5, label="target = 0")
plt.ylabel('Destiny plot', fontsize=12)
plt.xlabel(feature, fontsize=12)
locs, labels = plt.xticks()
plt.tick_params(axis='both', which='major', labelsize=12)
plt.show()
- ps_reg_02, ps_car_13, ps_car_15 변수는 다른 변수들과 다르게 target=0 이 target=1 보다 더 높다.
4) real feature의 상관관계
def corr_heatmap(var):
correlations = trainset[var].corr()
cmap = sns.diverging_palette(50,10,as_cmap=True)
fit, ax = plt.subplots(figsize=(10,10))
sns.heatmap(correlations, cmap=cmap, vmax=1.0, center=-0, fmt='.2f',
square=True, linewidths=.5, annot=True, cbar_kws={"shrink": .75})
plt.show()
var = metadata[(metadata.type == 'real') & (metadata.preserve)].index
corr_heatmap(var)
-
강한 상관관계 변수
- ps_reg_01 와 ps_reg_02 : 0.47
- ps_reg_01 와 ps_reg_03 : 0.64
- ps_reg_02 와 ps_reg_03 : 0.52
- ps_car_12 와 ps_car_13 : 0.67
- ps_car_13 와 ps_car_15 : 0.53
-
위의 변수들을 소량만 샘플링하여 차트화 해보자
sample = trainset.sample(frac=0.05)
var = ['ps_reg_01', 'ps_reg_02', 'ps_reg_03','ps_car_12','ps_car_13','ps_car_15','target']
sample = sample[var]
sns.pairplot(sample, hue='target', palette='Set1', diag_kind='kde')
plt.show()
5) binary feature
v = metadata[(metadata.type =='binary') &(metadata.preserve)].index
trainset[v].describe()
trianset의 binary data의 분포를 보자. 파란색은 target이 0인 비율이고, 빨간색은 target 이 1인 비율을 나타낸다.
bin_col = [col for col in trainset.columns if '_bin' in col]
zero_list = []
one_list = []
for col in bin_col:
zero_list.append((trainset[col]==0).sum() / trainset.shape[0]*100)
one_list.append((trainset[col]==1).sum() / trainset.shape[0]*100)
plt.figure()
fit, ax = plt.subplots(figsize=(6,6))
# bar plot
p1 = sns.barplot(ax=ax, x= bin_col, y=zero_list, color="blue")
p2 = sns.barplot(ax=ax, x= bin_col, y=one_list,bottom=zero_list, color="red")
plt.ylabel('Percentage of zero/one [%]', fontsize=12)
plt.xlabel('Binary features', fontsize=12)
locs, labels = plt.xticks() # 어떤 라벨로 표현할지 조절하고 싶을때, plt.xticks() 사용
plt.setp(labels, rotation=90)
plt.tick_params(axis='both', which='major', labelsize=12)
plt.legend((p1, p2), ('Zero', 'One'))
plt.show()
- 1 비율이 작은 변수 : ps_ind_10_bin, ps_ind_11_bin, ps_ind_12_bin, ps_ind_13_bin
- 1 비율이 큰 변수 : ps_ind_16_bin, ps_cals_16_bin (60% 이상).
var = metadata[(metadata.type =='binary') & (metadata.preserve)].index
var = [col for col in trainset.columns if '_bin' in col]
i = 0
t1 = trainset.loc[trainset['target'] != 0]
t0 = trainset.loc[trainset['target'] == 0]
sns.set_style('whitegrid')
plt.figure()
fig, ax = plt.subplots(6,3,figsize=(12,24))
for feature in var :
i += 1
plt.subplot(6,3,i)
sns.kdeplot(t1[feature], bw=0.5, label="target = 1")
sns.kdeplot(t0[feature], bw=0.5, label="target = 0")
plt.ylabel('Destiny plot', fontsize=12)
plt.xlabel(feature, fontsize=12)
locs, labels = plt.xticks()
plt.tick_params(axis='both', which='major', labelsize=12)
plt.show()
6) categorical features
var = metadata[(metadata.type == 'categorical') & (metadata.preserve)].index
for feature in var :
fig, ax = plt.subplots(figsize=(6,6))
cat_perc = trainset[[feature, 'target']].groupby([feature], as_index=False).mean()
cat_perc.sort_values(by='target', ascending=False, inplace=True)
sns.barplot(ax=ax, x= feature, y ='target', data=cat_perc, order=cat_perc[feature])
plt.ylabel('Percent of target with value 1 [%]', fontsize=12)
plt.xlabel(feature, fontsize=12)
plt.tick_params(axis='both', which='major', labelsize=12)
plt.show()
categorial feature는 denstity plot으로 나타낼수 있다.
var = metadata[(metadata.type =='categorical') & (metadata.preserve)].index
i = 0
t1 = trainset.loc[trainset['target'] != 0]
t0 = trainset.loc[trainset['target'] == 0]
sns.set_style('whitegrid')
plt.figure()
fig, ax = plt.subplots(4,4,figsize=(16,16))
for feature in var :
i += 1
plt.subplot(4,4,i)
sns.kdeplot(t1[feature], bw=0.5, label="target = 1")
sns.kdeplot(t0[feature], bw=0.5, label="target = 0")
plt.ylabel('Destiny plot', fontsize=12)
plt.xlabel(feature, fontsize=12)
locs, labels = plt.xticks()
plt.tick_params(axis='both', which='major', labelsize=12)
plt.show()
7) trainset, testset 사이의 데이터 불균형
먼저 registration 변수를 알아보자
var = metadata[(metadata.category =='registration') & (metadata.preserve)].index
sns.set_style('whitegrid')
plt.figure()
fig, ax = plt.subplots(1,3,figsize=(12,4))
i=0
for feature in var :
i += 1
plt.subplot(1,3,i)
sns.kdeplot(trainset[feature], bw=0.5, label="train")
sns.kdeplot(testset[feature], bw=0.5, label="test")
plt.ylabel('Distribution', fontsize=12)
plt.xlabel(feature, fontsize=12)
locs, labels = plt.xticks()
plt.tick_params(axis='both', which='major', labelsize=12)
plt.show()
모든 registration 변수는 균형있게 분포되어있다. 다음은 car
변수에 대해서 알아보자
var = metadata[(metadata.category =='car') & (metadata.preserve)].index
sns.set_style('whitegrid')
plt.figure()
fig, ax = plt.subplots(4,4,figsize=(20,16))
i=0
for feature in var :
i += 1
plt.subplot(4,4,i)
sns.kdeplot(trainset[feature], bw=0.5, label="train")
sns.kdeplot(testset[feature], bw=0.5, label="test")
plt.ylabel('Distribution', fontsize=12)
plt.xlabel(feature, fontsize=12)
locs, labels = plt.xticks()
plt.tick_params(axis='both', which='major', labelsize=12)
plt.show()
car
변수도 trainset과 testset의 데이터 분포는 비슷해보인다. 다음으로 ind(individual) 변수를 보자.
var = metadata[(metadata.category =='individual') & (metadata.preserve)].index
sns.set_style('whitegrid')
plt.figure()
fig, ax = plt.subplots(5,4,figsize=(20,16))
i=0
for feature in var :
i += 1
plt.subplot(5,4,i)
sns.kdeplot(trainset[feature], bw=0.5, label="train")
sns.kdeplot(testset[feature], bw=0.5, label="test")
plt.ylabel('Distribution', fontsize=12)
plt.xlabel(feature, fontsize=12)
locs, labels = plt.xticks()
plt.tick_params(axis='both', which='major', labelsize=12)
plt.show()
individual 변수도 고르게 분포되어 있다. 마지막으로 calc
변수를 보자.
var = metadata[(metadata.category =='calculated') & (metadata.preserve)].index
sns.set_style('whitegrid')
plt.figure()
fig, ax = plt.subplots(5,4,figsize=(20,16))
i=0
for feature in var :
i += 1
plt.subplot(5,4,i)
sns.kdeplot(trainset[feature], bw=0.5, label="train")
sns.kdeplot(testset[feature], bw=0.5, label="test")
plt.ylabel('Distribution', fontsize=12)
plt.xlabel(feature, fontsize=12)
locs, labels = plt.xticks()
plt.tick_params(axis='both', which='major', labelsize=12)
plt.show()
'Competition > Kaggle' 카테고리의 다른 글
[kaggle][필사] Porto serqruo safe prediction(Gabriel Preda) (3) (0) | 2020.09.10 |
---|---|
[kaggle][필사] Porto serqruo safe prediction(Gabriel Preda) (1) (0) | 2020.09.07 |
[kaggle] Porto serqruo safe prediction(Bert Carremans) (2) (0) | 2020.09.06 |