[신뢰성] 머신러닝 개요 및 성능 평가
* 모델 목록 및 라이브러리
라쏘 | from sklearn.linear_model import Lasso |
OLS | from sklearn.linear_model import LinearRegression |
릿지 | from sklearn.linear_model import Ridge |
K-NN | from sklearn.neighbors import KNeighborsRegressor |
LDA | from sklearn.decomposition import LatentDirichletAllocation |
데이터는 numpy 데이터프레임 활용
* Model Input Parameters(감성 분석 및 영향력으로 구분)
- 감성분석
자기 감성 분석(감성 편차 관점에서 분석)
타인 감성 분석(Retweet, Reply, Mention)
* 신뢰성이 낮은 사용자들은 콘텐츠 별로 감성 편차가 크고, 신뢰성이 높은 사용자들은 감성 편차가 작은 경향
- 영향력
그래프 점수
트윗 수
좋아요 수
리트윗 수
h-index (논문 수와 피인용 수를 트윗 수와 리트윗 수로 각각 대체)
사용자 평판은 두 개에 가중치를 적용해서 합한 값이다.
* Code
* 하이퍼파라미터: 머신러닝 알고리즘이 학습하지 않는 파라미터로 사람이 사전에 지정해줘야 함. 대표적으로 릿지와 라쏘의 alpha 규제 강도 파라미터가 있다.
* 고려한 하이퍼파라미터
1. Ridge와 Lasso 모델의 최적의 alpha 규제 강도 파라미터
2. K-NN 회귀 모델의 K값
3. 학습률 (Learning Rate) - Learning Decay Rate와 연관지어 준비 필요
4.
Feature들은 정규화를 통해 스케일을 맞춰줘야 모든 데이터 포인트의 동일한 정도의 중요도(스케일)로 반영이 될 수 있다.(https://hleecaster.com/ml-normalization-concept/)
모델의 학습 데이터와 검증 데이터를 약 8:2로 나누고 설명변수와 종속변수를 나누는 코드이다.
cond = np.random.rand(len(df))>.2
train = np.where(cond)[0]
valid = np.where(~cond)[0]
train_df = df.iloc[train]
valid_df = df.iloc[valid]
train_y = train_df["rep"]
train_xs = train_df.drop(["rep"], axis = 1)
valid_y = valid_df["rep"]
valid_xs = valid_df.drop(["rep"], axis = 1)
GridSearchCV로 최적의 파라미터 탐색
- params는 딕셔너리 형태로 구성되며 cv는 cross validation의 약어로 교차 검증을 위한 fold 횟수이다.
- CV가 필요한 이유는 모델 overfitting 뿐만 아니라 underfitting까지 막으려고 쓴다.
- 시간이 오래 걸린다는 단점이 있다.
CV 종류는 K-Fold CV가 있다. 그 방식은 아래와 같다.(https://medium.com/@zstern/k-fold-cross-validation-explained-5aeba90ebb3)
① 전체 데이터를 K개 fold로 분할
② 분할된 fold 중 test data로 할당된 적이 없는 fold 1개를 validation set으로 할당
③ 위 ② 과정을 K번 반복
④ K개의 모델 성능 평가 결괏값을 평균 내어 최종 결괏값으로 활용
④에서 제일 좋은 K값을 찾는 과정도 필요하다.
다중회귀를 활용한 CV에서 성능은 결정계수 혹은 RMS로 측정한다.
결국 가장 잘 학습된 모델을 얻게 된다.
knn = KNeighborsRegressor()
//파라미터 정보
params = {'n_neighbors':[5, 10, 15, 20, 25, 31]}
//GridSearch후 최적의 파라미터로 설정된 모델 도출
model = GridSearchCV(knn, params, cv=5)
#모델 학습
model.fit(X_train,y_train)
model.best_params_
print(model.best_params_)
https://hleecaster.com/ml-knn-regression-example/
훈련 데이터로 모델 학습(fit) 및 검증 데이터로 성능 확인. KNN은 인스턴스간 유클리디안 거리를 계산한다. 분류 모델이라면 K를 홀수로 정해야 항상 분류가 가능하다.
KNN은 학습 과정이라고 할 만한 절차가 없다. 모델에 데이터를 저장해놓고 새로운 데이터가 들어왔을 때 기존 데이터와의 거리를 재서 이웃들을 뽑고 회귀를 하기 때문이다. 이를 게으른 학습 또는 모델이라고 부른다. 다른 말로 Instance-based learning이라고도 하며, 데이터로부터 모델을 생성해 과업을 수행하는 Model-based와 대비된다.
KNN의 GridSearch는 최적의 k를 찾는 것에 의미가 있다고 볼 수 있다.
KNN Regressor 같은 경우는 최근접 k개 이웃들의 평균을 계산한다.
m = m.fit(train_xs, train_y)
std_score = m.score(valid_xs, valid_y)
본래 KNN은 특성 중요도를 계산하는 방법이 제공되지 않음. 하지만 특정 특성을 행끼리 서로 마구잡이로 교환했을 때의 성능 차이를 특성마다 비교하면서 해당 특성의 중요도를 추정해볼 수 있는 방법으로 계산했음.
valid_SL = valid_xs.copy()
valid_SL[graph] = np.random.permutation(valid_SL[graph])
feat_imp[graph] = std_score - m.score(valid_SL, valid_y)
* 다중공선성
다중 회귀 모델의 경우 다중 공선성이 발생함. 이는 독립 변수들 간에 강한 상관관계가 나타나는 문제로 데이터 분석 시 부정적인 영향을 준다. 일반적인 회귀 분석 시 설명 변수들은 독립적이라고 가정하므로 두 변수가 상관관계를 갖는 것은 회귀 분석의 전제 가정을 위배하는 것이다.
다중공선성이 있으면:
- 계수 추정이 잘 되지 않거나 불안정해져서 데이터가 약간만 바뀌어도 추정치가 크게 달라질 수 있다
- 계수가 통계적으로 유의미하지 않은 것처럼 나올 수 있다
진단법)
- 결정계수 R2값은 높아 회귀식의 설명력은 높지만 식안의 독립변수의 P값(P-value)이 커서 개별 인자들이 유의하지 않는 경우가 있다. 이런 경우 독립변수들 간에 높은 상관관계가 있다고 의심된다.
- 독립변수들간의 상관계수를 구한다.
- 분산팽창요인(Variance Inflation Factor,VIF)를 구하여 이 값이 10을 넘는다면 보통 다중공선성의 문제가 있다.
해결법)
- 상관관계가 높은 독립변수중 하나 혹은 일부를 제거한다.
- 변수를 변형시키거나 새로운 관측치를 이용한다.
- 자료를 수집하는 현장의 상황을 보아 상관관계의 이유를 파악하여 해결한다.
- 주성분 분석(PCA,Principle Component Analysis)를 이용한 diagonal matrix의 형태로 공선성을 없애준다.
https://laoonlee.tistory.com/12
다중공선성을 제거하면 회귀 계수에 따라 사용자의 신뢰성 측정 시 각 요인의 중요도를 판별할 수 있다.
* 성능 평가 항목
* 정답 셋
Forbes 랭킹 100명 점수를 기준으로 계산함. 학습은 train 데이터, valid 데이터를 8:2로 나눔.그리고 train 데이터든 valid 데이터든 다시 입력 데이터와 정답 셋으로 나뉨.
* 결정계수
1. 최소제곱법을 활용한 선형회귀분석에서 종속변수의 분산 중에서 독립변수로 설명되는 비율
2. 쉽게 말해, 이 통계 모델로 대상을 얼마나 잘 설명할 수 있는가를 숫자로 나타낸 것
3. 해당 모형이 타겟 변수를 얼마나 잘 예측 혹은 설명하는지 평가하는 지표 중 하나로 자주 사용
* 사용자 평판의 분산 및 표준편차로 사용자들의 평균이 얼마나 고르게 존재하는가도 성능 평가 항목으로 활용
성능 평가 결과, HITS(3.92) > 고유벡터 중심성(3.58) > 매개중심성(1.11) > 그래프 X