RFE :반복적 특성 선택(Recursive Feature Selection)
모든 특성 조합을 다 시도해보고 가장 좋은 셋을 찾겠다.
모든 특성에서 출발하여 지정한 특성 개수에 도달할 때까지 특성을 제거.
(step = 한번에 제거할 변수)
결론 : 정확도가 변수 7개에서 8개로 늘어 날때 확연한 차이가 일어나고 그 이후부터는
큰 차이가 없다. bmi 와 bmi30 변수는 수정하거나 포함시키지 않는다.
#%% 코드
df = pd.read_csv("c:\\data\\insurance.csv", engine='python', encoding='CP949')
df = pd.get_dummies(df, drop_first=True)
def func_1(x):
if x >=30:
return 1
else:
return 0
df['bmi30'] = df['bmi'].apply(func_1)
df['bmi30_smoker'] = df['bmi30']*df['smoker_yes']
df2 = df.iloc[:,[0,1,2,4,5,6,7,8,9,10]]
X = df2.to_numpy()
y = df.iloc[:, 3].to_numpy()
model = LinearRegression()
score_list=[]
x = [x for x in range(1,12)]
for i in x:
selector = RFE(model, n_features_to_select=i, step =1 )
selector = selector.fit(X,y)
score_list.append(selector.score(X,y))
result = pd.DataFrame(data=dict(n_feature=x,score=score_list))
result
#그래프
plt.figure(figsize=(12,5))
plt.subplots_adjust(left=0.125,
bottom=0.1,
right=1,
top=0.9,
wspace=0.2,
hspace=0.35)
plt.subplot(131) # 추가로 그래프를 그린다.
plt.plot(x,score_list,color='blue', marker='o', markerfacecolor='red')
plt.title('Accuracy', size=15)
plt.xticks([0,1,3,5,7,8,9,11])
plt.axvline(7, color='r',linestyle=':')
plt.axvline(8, color='r',linestyle='--')
plt.xlabel("n_feature")
plt.ylabel('Accuracy')
plt.show()
# 8 개 일때 중요 변수들과 다른 변수들 보기
selector = RFE(model, n_features_to_select=8, step =1 )
selector = selector.fit(X,y)
score_list.append(selector.score(X,y))
# 영향력이 큰 중요 변수들
for i,j in zip(df2.columns.values,list(selector.support_)):
if j==True:
print(i)
else:
pass
# 영향력이 작은 변수들
for i,j in zip(df2.columns.values,list(selector.support_)):
if j==False:
print(i)
else:
pass