Etc/Deep Learning

3장(3) 실습 - 로지스틱 회귀 | 선형 회귀 (figure | enumerate | zip | subplot | np.reshape | digits | 혼동행렬 시각화 | train_test_split | y_pred)

z.zzz 2021. 7. 25. 15:31

3.1.4 신규 데이터(숫자, digits)에 대한 정확도 예측(로지스틱 회귀 분석)

1. plt.figure() : 새로운 figure 생성

   - 옵션 figsize=(가로, 세로) : 최초 창의 크기를 가로 세로 n인치로 설정

plt.figure(figsize=(20, 4))

 

2. enumerate()

반복문 사용 시 몇 번째 반복문인지 확인이 필요할 때 사용.

반환값 : 인덱스 번호와 컬렉션의 원소(tuple형태로)

for index, (image, label) in enumerate(배열)):

 

3. zip(배열1, 배열2, ... )

어떤 배열들에 대해서 한번에 다루고 싶을 때 사용

for x, y in zip([1, 2, 3], [4, 5, 6]):
    print(x, y)
//1 4
//2 5 
//3 6

 

4. subplot(nrow, ncol, pos); 서브플롯

  여러 개의 그래프를 그리고 싶을 때 이용

  //그래프를 n행 n열로 배치, pos로 몇번째에 그릴지 위치 지정

plt.subplot(1, 5, index + 1)           //전체 그래프는 1행 5열로 배치할거고 위치는 index + 1해서 지정

 

5. np.reshape(변경할 배열, 차원)

  현재 배열의 차원을 변경할 때 사용 

  반환값 : 행렬

np.reshape(image, (8,8))       //image 배열을 (8, 8)차원으로 변경

 

6. digits; 숫자 데이터셋(from sklearn)

   0~9까지 숫자의 이미지 픽셀 데이터 세트

   - digits.data : 숫자 샘플을 분류하는데 사용할 수 있는 속성(독립변수)

   - digits.target : 학습하고자하는 각각의 숫자 이미지에 대응하는 숫자(정확한 예측 여부를 판단하는 기준)(종속변수)

     + shape 옵션 : 배열의 행열 구성을 보여줌

from sklearn.datasets import load_digits
digits = load_digits()
print("Image Data Shape", digits.data.shape)
print("Label Data Shape", digits.target.shape)

 

7. LogisticRegression.fit(x_train, y_train); 로지스틱 회귀

logisticRegr = LogisticRegression()//로지스틱 회귀 모델의 인스턴스 생성(인스턴스: 클래스에 의해 생성된 객체
logisticRegr.fit(x_train, y_train)      //모델 훈련(x를 input으로 줬을 때 실제값 y에 가까운 θ 찾기

 

8. reshape()

  배열의 차원을 재구조화, 변경할 때 사용

+ reshape()에 -1이 인자로 들어가는 경우

reshape(-1, 정수) 열이 고정되면서 행이 가변적
reshape(정수, -1) 행이 고정되면서 열이 가변적
reshape(-1) 1차원 배열 반환

 

9. 혼동행렬 시각화

  - heatmap : 열(heat)분포도, 2차원 수치 데이터를 색으로 표시

                  heatmap을 이용 → Target Feature 나머지 독립변수들의 상관계수를 직관적으로 확인 가능

cm = metrics.confusion_matrix(y_test, predictions)       #혼동행렬
plt.figure(figsize=(9, 9))    #가로세로 9인치의 figure 생성

sns.heatmap(cm,                   #heatmap : 열분포도
                 annot=True,        #annot : 각 셀의 값 표기 유무
                 fmt=".3f",            #fmt : 그 값의 데이터 타입
                 linewidths=.5,       #linewidth : 셀 사이에 선을 집어넣음
                 square=True,
                 cmap='Blues_r');    #cmap : map의 색 설정
plt.show();

  * 참고 : https://dsbook.tistory.com/51

 


3.1.4 최대 기온 예측(회귀 분석)

1. .values.reshape(-1,1)

   - reshape(-1, 1) : 열은 하나로 고정, 행이 가변적

   - .value.reshape(-1, 1)하는 이유 : X는 2차원 array 형태여야 하기 때문([[x1], [x2], [x3], ... , [xn]] 형태가 됨)

                                           (이러는 이유는 X 변수가 하나가 아니라 여러개일 때 다중회귀분석을 실시하기 위함)

                                                                        //다중회귀분석 : 여러개의 독립 변수 x를 사용하여, 종속 변수 y의 움직임을 예측

X = dataset['MinTemp'].values.reshape(-1,1)
y = dataset['MaxTemp'].values.reshape(-1,1)

 

2. train_test_split(X, y)

   클래스를 개별 배열로 받음        //클래스 : 레이블의 범주(ex. 붓꽃의 종류)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

 

3. 회귀 모델에 대한 예측

   ✔입력값으로 X_test를 넣은 예측 결과를 받는 변수명이 왜 y_pred인가?

      : X에 모델을 적용, 예측하면 결과로 y값이 도출됨

   ✔y_test와 y_pred의 유사도를 비교하는 이유

      : x, y 같은 행을 뽑아옴 → y예측값(y_pred, x가 input)과 실제 y값(y_test)은 비슷해야함

y_pred = regressor.predict(X_test) #X에 모델을 적용해 예측하면 y값이 나옴
df= pd.DataFrame({'Actual': y_test.flatten(), 'Predicted': y_pred.flatten()}) 

 


Q. 로지스틱 회귀(4) reshape(1, -1)하는 이유?

digits 참고 : https://antilibrary.org/1047

reshape 참고 : https://rfriend.tistory.com/345

선형회귀 참고 : http://hleecaster.com/ml-linear-regression-example/