HeYStRanGeR
article thumbnail

 

(2022.04.02)

기계학습 수업들으면서 정리하기 8탄

Lecture4_ML 내용정리-2

 


 

다변량 선형회귀 분석을 위해서는 데이터 확보가 매우 중요하다.

 

캐글(kaggle)이라는 사이트는 다양한 데이터를 가지고 있는데, 여기서 데이터를 가져와 실습을 진행해보았다.

 

y는 기대수명으로 두고, x에 해당하는 데이터를 정리하려고한다.

기대수명과의 상관관계를 파악하여 상관관계가 높은 데이터만 가져오고, 낮은 데이터를 버리도록 한다.

왜냐면, 상관관계가 크지 않는 데이터까지 포함해버리면, 학습이 잘 되지 않거나, 예측의 신뢰도가 떨어질 수 있기 때문이다.

 

1. 우선, 다변량 데이터의 값이 있는지 없는지를 판별한다. --> isnull() 

2. 데이터 값이 없다면, dropna(inplace=True) 를 통해서 결손값 데이터를 삭제해준다.

(inplace=True : 값자체를 바꿔주는 것, inplace=False: 그냥 값 불러와서 바꿔준 값을 보여줌)

3. pandas 라이브러리의 corr()함수를 사용하여 상관행렬(correlation matrix) 생성해준다.

4. seaborn 라이브러리의 heatmap() 함수를 사용하여 상관행렬을 그려준다. (상관계수로 데이터 골라내도 된다.)

5. seaborn 라이브러리의 pariplot() 함수를 사용하여 특징들의 쌍 그림을 확인하고 중요 특징을 추출한다.

6. 다변량 선형 회귀에 사용할 데이터를 훈련용과 검증용으로 분리한다.

7. 정규화나 표준화를 통해 데이터를 정제하여 선형회귀 분석한다.


 

우선, 실습을 진행하기에 앞서 몇가지를 정리해보았다.

 

[상관관계]

여기서 주의할 것: 음수<양수 가 아니다.

절댓값으로 생각

음의 기울기: 상관관계 음수값

양의 기울기: 상관관계 양수값

 

 

 

전체 변수들끼리의 상관관계

Q: 상관관계가 얼마 이하이면, 데이터를 버려야하나요?

A: 딱히 기준은 없다. 근데 보통 DL에서는 데이터를 굳이 버리지 않는다.

DL이 알아서 상관관계의 값을 따져 데이터로 활용할 것이기 때문이다.

 

 

 

 

[피어슨 상관계수: Pearson correlation coefficient]

이 친구는 일반적인 상관관계랑은 조금 다르다.

어려운 정의를 가져오면, 피어슨 상관계수는 단순히 두 데이터들을 선형관계로 가정했을 때, 관찰되는 기울기가 아니라 두 데이터의 공분산을 각각의 표준편차의 곱으로 나눈 값이다 라고 할 수 있다.

즉, 두께가 두꺼울수록 피어슨 상관계수의 절댓값은 작아지고, 점의 분포들이 모여있지 않으면 0이다.

두께가 아주 앏아 마치 직선처럼 보이면 그 피어슨 상관계수의 절댓값은 1이고, 기울기에 따라 +1과 -1이 정해진다.

 

데이터의 상관관계를 파악하기 위해서 쌍그림(pair plot)을 이용할 수도 있다. 

 

 

 

[validation : 검증]

학습과정은 실제 결과값과 예측한 결과값과의 오차를 가장 적게 만들기 위한 과정을 말한다.

훈련용 data로 알고리즘의 성능을 검사한다면 당연히 성능이 좋다고 나올 것이다.

--> 즉, 알고리즘 성능을 검사하기 위해서는 trainning data 가 아닌 validation data로 테스트를 해야한다.

 

from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2)

train_test_split()이라는 함수를 이용해서, X와 y에 담긴 데이터 가운데 80%는 훈련용, 20%는 검증용으로 나눈다.

 

 

from sklearn.linear_model import LinearRegression

lin_model=LinearRegression()
lin_model=fit(X_train,y_train)

LinearRegression 모델을 사용하여 학습을 진행한다.

 

 

xy_range=[40,100]

y_hat_train=lin_model.predict(X_train)
plt.scatter(y_train,y_hat_train)
plt.plot(xy_range,xy_range)

predict() 함수는 입력에 대한 예측을 하는 함수이다.

당연히 predict()의 인자로 X_train을 주었으니까 예측이 잘 되는 것이다.

 

 

y_hat_test=lin_model.predict(X_test)
plt.scatter(y_test,y_hat_test)
plt.plot(xy_range,xy_range)

이제 predict() 함수에 인자로 X_test를 주었다.

그러면 이제 이 알고리즘(함수)이 다른 데이터에서도 잘 동작하는지 확인해줄 수 있다.

 

 

 

최종확인 방법으로는 역시 MSE를 사용해 줄 것이다. (아래코드)

from sklearn.metrics import mean_squared_error
print('Mean squared error:',mean_squared_error(y_test,y_hat_test))

 


 

정규화 Normalization

 

- 각각의 데이터 값들이 규모가 서로 다를 수 있기 때문에 데이터를 정제하는 과정이 필요하다.

- 위의 과정대로 데이터들을 정규화하면 데이터들이 모두 0~1 사이의 값을 가지게 된다.

 

from sklearn.preprocessing import normalize
n_X=normalize(X,axis=0)

- axis 파라미터는 defalut로 1로 설정되어있어서 0으로 설정해준다. 그러면 배열은 행단위로 정규화된다. 

 

 

 

 

 

 

표준화 Standardization

표준화는 데이터 값들이 평균에 몰려있도록 하는 것이다. 

정규화를 통해 얻은 n_X 데이터들이 어떤 값을 가지는지 histogram을 통해서 확인하고, 이상치 outlier 를 파악한다.

--> outlier에 대한 정제 기법이 바로 표준화이다. 

 

표준화는 전체의 평균과 분산을 사용한다. (mean & variance)

 

 

from sklearn.preprocessing import StandardScaler
scaler=StandardScaler()       # 표준화 스케일러 작성
s_X=scaler.fit_transform(X)   # 표준화 스케일러 적용
plt.hist(s_X,bins=5)          # 표준화 결과의 가시화

fit_transform() 함수에 표준화할 데이터를 주면 된다.

 

 

 

그렇다면 정규화와 표준화 중에서 어떤 것을 선택하는 것이 좋을까?

--> 아직까지도 이에 대한 선택은 인간의 직관이 필요하다. 보통 정규화를 이용하기는 한다. 이러한 부분까지 인공지능이 결정할 수 있기에는 아직은 부족하다. 

728x90
profile

HeYStRanGeR

@HeYStRanGeR

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!