AIB Section2. n 213ブリッジ回帰(02/24)


Ridge Regression
1. One-hot encording
2. Feature selection
3. Ridge regression
1. One-hot encording
  • One-hot encording
    カテゴリ
  • 名目型=無秩序strデータ
  • 、一意の値は、1回の熱符号化によって0および1に変換される
  • シーケンス型と混同されやすい.
  • 種類が多すぎると使いにくいです.
  • 関連性->
  • を考えてみましょう
  • シーケンス型
  • #코드
    
    #판다스 프로파일링 다운
    !pip install -U pandas-profiling
    
    #데이터 프로파일링 (카테고리 데이터 찾기)
    df.profile_report()
    
    #인코더 다운
    !pip install category_encoders
    
    #원핫 인코더 불러오기
    from category_encoders import OneHotEncoder
    from sklearn.model_selection import train_test_split
    
    #원핫인코딩
    encoder = OneHotEncoder(use_cat_names = True)
    train = encoder.fit_transform(df)
    test = encoder.transform(df)
    
    #훈련, 테스트 데이터 나누기
    x_train, x_test = train_test_split(
    train, test_size=0.2, train_size=0.8, random_state=2
    )
    
    #타겟, 피쳐 나누기
    y_train = x_train['target]
    x_train = x_train.drop('target', axis = 1)
    
    #test 피쳐, 타겟나누기
    y_test = x_test['target]
    x_test = x_test.drop('target', axis = 1)
    2. Feature selection
  • の特性を選択することは,課題に適した特性を創造する過程である.
  • #코드
    from sklearn.feature_selection import f_regression, SelectKBest
    
    #셀렉터 지정(f검정 기준, 20개 선택)
    selector = SelectKBest(score_func=f_regression, k=20)
    
    #훈련데이터
    X_train_selected = selector.fit_transform(x_train, y_train)
    
    #테스트 데이터
    X_test_selected = selector.transform(x_test)
    
    #특성 전체 이름
    all_names = x_train.columns
    
    # selector.get_support()(선택된 특성을 bool로 나타내줌)
    selected_mask = selector.get_support()
    
    ## 선택된 특성들
    selected_names = all_names[selected_mask]
    
    ## 선택되지 않은 특성들
    unselected_names = all_names[~selected_mask] 
    
    #feature list화
    kss=[]
    for i in selected_names:
      kss.append(i)
    
    #k=20 훈련데이터, 테스트데이터 만들기
    x_train = x_train[kss]
    x_test = x_test[kss]
    3. Ridge regression

  • ブリッジ回帰既存の線形回帰に調整パラメータを追加

  • Ridge回帰このオフセットを大きくして小さくすることで
    「正規化」(Regularization)を実行します.ここでいう正規化.
    モデルを変形することによってオーバーフィットを緩和し,汎用性を向上させる方法.

  • ランダの増加に伴い、正規化はゼロに近い.
    	#코드
    	# sklearn 버전 확인 -> 0.23보다 낮다면 재설치 진행.
    	import sklearn
    	sklearn.__version__
    
    	# sklearn 재설치
    	!pip uninstall scikit-learn -y
    	!pip install -U scikit-learn
    
    	# sklearn 버전 재확인 -> 0.23 이상으로 설치되었는지 확인
    	import sklearn
    	sklearn.__version__
    
    	#from sklearn.linear_model import RidgeCV
    	from warnings import simplefilter
    
    	simplefilter(action='ignore', category=FutureWarning)
    
    	#람다설정
    	alphas = [0, 0.001, 0.01, 0.1, 1]
    
    	#릿지회귀
    	ridge = RidgeCV(alphas=alphas,normalize=True, cv=5)
    	ridge.fit(x_train, y_train)
    
    	from sklearn.preprocessing import PolynomialFeatures
    	from sklearn.pipeline import make_pipeline
    
    	X_total = pd.concat([x_train, x_test])
    	y_total = pd.concat([y_train, y_test])
    
    	def RidgeCVRegression(degree=3, **kwargs):
    	    return make_pipeline(PolynomialFeatures(degree), 
                       RidgeCV(**kwargs))
    
    	# 모든 데이터를 사용해 최종 모델을 만듭니다.
    	model = RidgeCVRegression(alphas=alphas, normalize=True, cv=5)
    	model.fit(X_total, y_total)
    
    	coefs = model.named_steps["ridgecv"].coef_
    	print(f'Number of Features: {len(coefs)}')
    
    	print(f'alpha: {model.named_steps["ridgecv"].alpha_}')
    	print(f'cv best score: {model.named_steps["ridgecv"].best_score_}')
  • 振り返る
    오늘 많이 힘들었다. 하지만 많은 것을 배운 하루였다.
    릿지회귀와 특성선택, 원핫인코딩에 대해서 배웠다. 
    원핫 인코딩은 이해하기 쉬웠다. 범주형을 0,1인 데이터로
    바꿔주는 것이기떄문이다. 특성선택은 좀 더 공부해야겠다. 
    릿지회귀도 좀 더 공부해야겠다. 정말 재밌다 진짜 재밌다.
    더 열심히 해서 쉽고 재밌게 느끼게 만들고 싶다. 
    일단 더 복습하는 것이 중요할 것 같다.