<jupyter_start><jupyter_text>xdata로 상관계수가 높은 column을 넣어서 Elastic- elasticnet으로 상관계수가 높은 feature를 넣어 모델생성<jupyter_code># 필요 패키지 로드
#from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import ElasticNet
from sklearn.metrics import mean_absolute_error
# y값인 q1-q5가 결측인 2020년 데이터 제거
a = df[0:-82]
a
# 경찰서와 연도 데이터 제거
a.drop(columns = ['jur_stn', 'year'], inplace = True)
a_ = a.drop(columns = ['q1', 'q2', 'q3', 'q4', 'q5'])
a_
a_1 = a_[['report_sx_여성', 'vio_cnt', 'theft_violence_x', 'robber_murder_x',
       'theft_violence_y', 'robber_murder_y', '가해_10대이하', '피해_80대이상', 'for_합계',
       'popu_2030', 'popu_o60', 'for_u20', 'for_2030', 'for_4050', 'for_o60',
       'single_합계', 'single_2030', 'single_4050', 'single_o60', 'single_f_합계',
       'single_f_4050', 'single_f_o60']]
a_2 = a_[['report_sx_여성', 'vio_cnt', 'theft_violence_x', 'robber_murder_x',
       'theft_violence_y', 'robber_murder_y', '가해_10대이하', '피해_80대이상', 'for_합계',
       'popu_o60', 'for_u20', 'for_2030', 'for_4050', 'for_o60', 'single_합계',
       'single_4050', 'single_o60', 'single_f_합계', 'single_f_4050',
       'single_f_o60']]
a_3 = a_[['mur_rob_cnt', '5m_crm_yn', 'theft_violence_x', 'robber_murder_x',
       'traffic_x', 'theft_violence_y', 'robber_murder_y', '가해_70대',
       '가해_80대이상', '피해_70대', 'for_합계', 'for_2030', 'for_4050', 'for_o60',
       'single_합계', 'single_2030', 'single_4050', 'single_f_2030', 'adult',
       'bell']]
a_4 = a_[['mur_rob_cnt', 'car_cnt', 'theft_violence_x', '가해_여', 'cctv', 'for_합계',
       'for_2030', 'for_4050', 'for_o60', 'single_합계', 'single_4050']]
a_5 = a_[['report_sx_여성', 'vio_cnt', 'theft_violence_x', 'robber_murder_x',
       'theft_violence_y', 'robber_murder_y', '가해_여', '가해_10대이하', '피해_80대이상',
       'for_합계', 'popu_2030', 'popu_o60', 'for_u20', 'for_2030', 'for_4050',
       'for_o60', 'single_합계', 'single_2030', 'single_4050', 'single_o60',
       'single_f_합계', 'single_f_4050', 'single_f_o60']]
# StandardScaling
scaler1 = StandardScaler()
scaler1.fit(a_1) # scaler에 xdata 학습
a_s1 = scaler1.transform(a_1)
a_s1
# StandardScaling
scaler2 = StandardScaler()
scaler2.fit(a_2) # scaler에 xdata 학습
a_s2 = scaler2.transform(a_2)
a_s2
# StandardScaling
scaler3 = StandardScaler()
scaler3.fit(a_3) # scaler에 xdata 학습
a_s3 = scaler3.transform(a_3)
a_s3
# StandardScaling
scaler4 = StandardScaler()
scaler4.fit(a_4) # scaler에 xdata 학습
a_s4 = scaler4.transform(a_4)
a_s4
# StandardScaling
scaler5 = StandardScaler()
scaler5.fit(a_5) # scaler에 xdata 학습
a_s5 = scaler5.transform(a_5)
a_s5
# x데이터 설정 2017, 2018 데이터를 학습용, 2019년 데이터를 검증용 데이터셋으로 설정

xtrain1 = a_s2[:-82]
xtest1 = a_s2[-82:]
xtrain2 = a_s2[:-82]
xtest2 = a_s2[-82:]
xtrain3 = a_s3[:-82]
xtest3 = a_s3[-82:]
xtrain4 = a_s4[:-82]
xtest4 = a_s4[-82:]
xtrain5 = a_s5[:-82]
xtest5 = a_s5[-82:]
# y데이터 설정 2017, 2018 데이터를 학습용, 2019년 데이터를 검증용 데이터셋으로 설정

train = a[:-82]
test = a[-82:]

ytrain1 = train['q1']
ytrain2 = train['q2']
ytrain3 = train['q3']
ytrain4 = train['q4']
ytrain5 = train['q5']

ytest1 = test['q1']
ytest2 = test['q2']
ytest3 = test['q3']
ytest4 = test['q4']
ytest5 = test['q5']
a_1.columns
# 그리드 서치 패키지
from sklearn.model_selection import GridSearchCV
# 최적 성능을 내는 lasso의 alpha값을 얻기 위해 param_grid 생성

param_grid = {'l1_ratio': np.linspace(0.01, 1.0, 100), 'alpha' : np.linspace(0.001, 1.0, 1000)}

#그리드 서치 설정
#grid_search = GridSearchCV(ElasticNet(), param_grid = param_grid, cv = 10, n_jobs = -1, scoring ='r2')
grid_search = GridSearchCV(ElasticNet(), param_grid = param_grid, cv = 10, n_jobs = -1, scoring ='neg_mean_absolute_error')<jupyter_output><empty_output><jupyter_text>q1 절도폭력<jupyter_code># 그리드 서치 후 최고 성능의 모델을 ela1에 저장

grid_search.fit(xtrain1, ytrain1)
ela1 = grid_search.best_estimator_
# MAE 출력

y_pred1 = ela1.predict(xtest1)
mean_absolute_error(ytest1, y_pred1)
# 결과

print('alpha =', ela1.alpha)
print('l1_ratio =', ela1.l1_ratio)
print(ela1.coef_) # Ridge 회귀분석으로 나온 weghit값
print('feature 갯수:', len(a_1.columns[ela1.coef_ != 0]))
print('가장 강한 양의 상관관계: ',a_1.columns[ela1.coef_.argmax()], '\n가장 강한 음의 상관관계: ', a_1.columns[ela1.coef_.argmin()])<jupyter_output>alpha = 0.035
l1_ratio = 1.0
[-0.06184511 -2.33635067 -0.39948134  1.27728687  0.39081619 -0.
 -0.         -1.92386271  0.          1.21651276 -0.38274654  1.99886289
 -1.38972091 -1.65551156  0.          3.32187811  0.         -0.
 -1.60045414 -0.        ]
feature 갯수: 13
가장 강한 양의 상관관계:  report_sx_여성 
가장 강한 음의 상관관계:  for_합계<jupyter_text>q2 강도살인<jupyter_code># 그리드 서치 후 최고 성능의 모델을 ela2에 저장

grid_search.fit(xtrain2, ytrain2)
ela2 = grid_search.best_estimator_
# MAE 출력

y_pred2 = ela2.predict(xtest2)
mean_absolute_error(ytest2, y_pred2)
# 결과

print('alpha =', ela2.alpha)
print('l1_ratio =', ela2.l1_ratio)
print(ela2.coef_) # Ridge 회귀분석으로 나온 weghit값
print('feature 갯수:', len(a_2.columns[ela2.coef_ != 0]))
print('가장 강한 양의 상관관계: ',a_2.columns[ela2.coef_.argmax()], '\n가장 강한 음의 상관관계: ', a_2.columns[ela2.coef_.argmin()])
# q2 관련 feature
print('상위 30개 feature\n', a_2.columns[sorted(range(len(ela2.coef_)), key=lambda i: abs(ela2.coef_[i]))[-30:]])<jupyter_output>상위 30개 feature
 Index(['피해_80대이상', 'robber_murder_y', 'report_sx_여성', 'robber_murder_x',
       'theft_violence_y', '가해_10대이하', 'for_합계', 'for_2030', 'for_u20',
       'theft_violence_x', 'vio_cnt', 'single_f_4050', 'single_f_o60',
       'single_4050', 'for_4050', 'single_f_합계', 'for_o60', 'popu_o60',
       'single_합계', 'single_o60'],
      dtype='object')<jupyter_text>q3 교통안전<jupyter_code># 그리드 서치 후 최고 성능의 모델을 lasso3에 저장

grid_search.fit(xtrain3, ytrain3)
ela3 = grid_search.best_estimator_
# MAE 출력

y_pred3 = ela3.predict(xtest3)
mean_absolute_error(ytest3, y_pred3)
# 결과

print('alpha =', ela3.alpha)
print('l1_ratio =', ela3.l1_ratio)
print(ela3.coef_) # Ridge 회귀분석으로 나온 weghit값
print('feature 갯수:', len(a_3.columns[ela3.coef_ != 0]))
print('가장 강한 양의 상관관계: ',a_3.columns[ela3.coef_.argmax()], '\n가장 강한 음의 상관관계: ', a_3.columns[ela3.coef_.argmin()])
# q3 관련 feature
print('상위 30개 feature\n', a_3.columns[sorted(range(len(ela3.coef_)), key=lambda i: abs(ela3.coef_[i]))[-30:]])<jupyter_output>상위 30개 feature
 Index(['robber_murder_y', 'single_f_2030', '가해_80대이상', 'single_2030', 'adult',
       'robber_murder_x', 'mur_rob_cnt', 'theft_violence_y', 'single_합계',
       'for_o60', 'theft_violence_x', '5m_crm_yn', 'for_합계', 'bell',
       'for_4050', 'for_2030', 'traffic_x', '가해_70대', '피해_70대', 'single_4050'],
      dtype='object')<jupyter_text>q4 법질서 준수도<jupyter_code># 그리드 서치 후 최고 성능의 모델을 lasso4에 저장

grid_search.fit(xtrain4, ytrain4)
ela4 = grid_search.best_estimator_
# MAE 출력

y_pred4 = ela4.predict(xtest4)
mean_absolute_error(ytest4, y_pred4)
# 결과

print('alpha =', ela4.alpha)
print('l1_ratio =', ela4.l1_ratio)
print(ela4.coef_) # Ridge 회귀분석으로 나온 weghit값
print('feature 갯수:', len(a_4.columns[ela4.coef_ != 0]))
print('가장 강한 양의 상관관계: ',a_4.columns[ela4.coef_.argmax()], '\n가장 강한 음의 상관관계: ', a_4.columns[ela4.coef_.argmin()])
# q3 관련 feature
print('상위 30개 feature\n', a_4.columns[sorted(range(len(ela4.coef_)), key=lambda i: abs(ela4.coef_[i]))[-30:]])<jupyter_output>상위 30개 feature
 Index(['cctv', 'for_o60', '가해_여', 'mur_rob_cnt', 'single_합계', 'single_4050',
       'car_cnt', 'for_2030', 'theft_violence_x', 'for_4050', 'for_합계'],
      dtype='object')<jupyter_text>q5 전반적 안전도<jupyter_code># 그리드 서치 후 최고 성능의 모델을 lasso4에 저장

grid_search.fit(xtrain5, ytrain5)
ela5 = grid_search.best_estimator_
# MAE 출력

y_pred5 = ela5.predict(xtest5)
mean_absolute_error(ytest5, y_pred5)
# 결과

print('alpha =', ela5.alpha)
print('l1_ratio =', ela5.l1_ratio)
print(ela5.coef_) # Ridge 회귀분석으로 나온 weghit값
print('feature 갯수:', len(a_5.columns[ela5.coef_ != 0]))
print('가장 강한 양의 상관관계: ',a_5.columns[ela5.coef_.argmax()], '\n가장 강한 음의 상관관계: ', a_5.columns[ela5.coef_.argmin()])
print('feature: ', a_5.columns[ela5.coef_ != 0])
# q5 관련 feature
print('상위 30개 feature\n', a_5.columns[sorted(range(len(ela5.coef_)), key=lambda i: abs(ela5.coef_[i]))[-30:]])<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.16910935738444194, 'fraction_numerical': 0.08455467869222097, 'mean_word_length': 5.423169750603379, 'pattern_counts': {'":': 0, '<': 21, '<?xml version=': 0, '>': 21, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '112630', 'license': 'MIT', 'n_tokens_mistral': 4407, 'n_tokens_neox': 4595, 'n_words': 679, 'path': '3.Model_code/elasticnet_grid_search_corr.ipynb', 'repo_name': 'Joripje/Main_project_police', 'size': '7983'}