머신러닝 & 딥러닝/케라스 실습

dataframe에서 slice 개념

깃허브 3. 은행 이탈고객 예측

깃허브 4. 인디안 당뇨병 예측

[ 0:3 ]  -> 0, 1, 2 : 0번 칼럼부터 3전 까지
[ 3:13 ] -> 3번(0부터니까 4번째) 칼럼부터 13번 전 까지
* 시작은 0번 칼럼부터 세서, 앞쪽은 포함 뒤쪽은 불포함이다. 수학에서 ●-----○ 개념

개수는 쉽게 13-3 = 10으로 계산하면 되지만,
처음부터 세려면 index 3은 0부터 시작하므로, 4번째 칼럼부터다.

*쉽게하기 (my)

인덱싱의 앞부분 : 뒷부분 중 앞부분만 해석 / 뒷부분은 그냥 읽기
[a:b] =========>  읽을 때는(+1) (a+1)번째 칼럼부터 b번째 칼럼까지
c번째 칼럼부터 d번째 칼럼까지 작성할 때는 (-1) ====> [c-1:d]

image
- 첫번째 칼럼처럼 보이는 index는 칼럼이 아니다!
- 0번 칼럼은 RowNumber 13번 칼럼인 Exited는 불포함!



sklearn.preprocessing.py에 있는 Label Encoder와 OneHot Encoder 클래스

DataFrame에 values값이 문자열일 때, 연산이 불가능하므로

  1. 딕셔너리를 이용해서 mapping(0, 1, 2)해도 되지만
  2. sklearn이라는 라이브러리를 이용하여 Label Encoder클래스를 이용하면, 특정칼럼의 값을 자동으로 0, 1, 2, 3으로 배정해준다.
    - 하지만 이럴경우, 0과 1,2,3은 크다작다의 대소관계가 생겨버려 연산시 잘못된 계산을 할 수 있다.
    - LabelEncoder( 문자열 칼럼-> 숫자)  ====>  OneHotEncoder( 숫자 -> 각 행당 1을 한개만 가지는 2진 matrix)  ====> to.array()
  3. OneHot Encoder는  대소관계를 가지는 숫자들 0, 1, 2에 대해서, 각 행당 1개만 1로 주고 나머지는 0으로 주어 절대적인 크기가 1로서 다 같도록 만든다.
    - 2진 코드로 만들어 진다.
    image
    - 따로 이것을 .toarray()를 통해 array로 만들어줘야 딥러닝 모델에 넣을 수 있는 데이터가 된다.


train_test_split

이전에는 from sklearn.cross_validation import train_test_split 를 통해서 train/test -> train/valid 를 나누었지만
- trainX, testX, trainY, testY = train_test_split(X, y, test_size= 0.2, random_state=42)
- trainX, valX, trainY, valY = train_test_split(trainX, trainY, test_size=0.2, random_state=42)


여기서는 cross validation을 사용하지 않으면서 & valid set 없이 & random_state라는 seed도 주지않고 0.2만큼 잘라내는 것을
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)


StandardScaler 과 Normalization

참고 사이트 : https://datascienceschool.net/view-notebook/f43be7d6515b48c0beb909826993c856/

스케일링

스케일링은 자료 집합에 적용되는 전처리 과정으로 모든 자료에 선형 변환을 적용하여 전체 자료의 분포를 평균 0, 분산 1이 되도록 만드는 과정이다.스케일링은 자료의 오버플로우(overflow)나 언더플로우(underflow)를 방지하고 독립 변수의 공분산 행렬의 조건수(condition number)를 감소시켜 최적화 과정에서의 안정성 및 수렴 속도를 향상시킨다.

my)
StandardScaler는 수치적으로는 평균은 0, 분산(표준편차) 1을 만들어주는  Z = X-m/a를 적용하여
값의 범위가 어떤 값을 가지든지 간에 표준 정규분포 안의 곡선으로 들어가도록 잡아준 것이다.

.

Scikit-Learn에서는 스케일링을 위한 함수와 클래스를 각각 제공한다. 스케일링 함수는 다음과 같다.

  • scale(X): 기본 스케일. 평균과 표준편차 사용
  • robust_scale(X): 중앙값(median)과 IQR(interquartile range) 사용. 아웃라이어의 영향을 최소화
  • minmax_scale(X): 최대/최소값이 각각 1, 0이 되도록 스케일링
  • maxabs_scale(X): 최대절대값과 0이 각각 1, 0이 되도록 스케일링

.

만약 파이프라인을 이용하면 스케일링을 함수가 아닌 Scaler 클래스로 구현해야 한다. scale 함수에 대응하는 클래스는 StandardScaler 클래스이다.

StandardScaler클래스의 사용 방법은 다음과 같다.

  1. 클래스 객체 생성
  2. fit() 메서드와 트레이닝 데이터를 사용하여 변환 계수 추정
  3. transform() 메서드를 사용하여 실제로 자료를 변환

또는 fit_transform() 메서드를 사용하여 계수 추정과 자료 변환을 동시에 실행할 수도 있다.


from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaler.fit(data1)
data2 = scaler.transform(data1)

data1.std(), data2.std()
(1.974000985027335, 1.0)

정규화 (Normalization)

정규화(Normarlization)는 스케일링과 달리 개별 데이터의 크기를 모두 같게 만들기 위한 변환이다. 따라서 개별 데이터에 대해 서로 다른 변환 계수가 적용된다.

정규화는 다차원 독립 변수 벡터가 있을 때 각 벡터 원소들의 상대적 크기만 중요한 경우에 사용된다.

from sklearn.preprocessing import normalize

x = np.vstack([np.arange(5, dtype=float) - 20, np.arange(5, dtype=float) - 2]).T
y1 = scale(x)
y2 = normalize(x)

print("original x:\n", x)
print("scale:\n", y1)
print("norms (scale)\n", np.linalg.norm(y1, axis=1))
print("normlize:\n", y2)
print("norms (normalize)\n", np.linalg.norm(y2, axis=1))
original x:
 [[-20.  -2.]
 [-19.  -1.]
 [-18.   0.]
 [-17.   1.]
 [-16.   2.]]
scale:
 [[-1.41421356 -1.41421356]
 [-0.70710678 -0.70710678]
 [ 0.          0.        ]
 [ 0.70710678  0.70710678]
 [ 1.41421356  1.41421356]]
norms (scale)
 [2. 1. 0. 1. 2.]
normlize:
 [[-0.99503719 -0.09950372]
 [-0.99861783 -0.05255883]
 [-1.          0.        ]
 [-0.99827437  0.05872202]
 [-0.99227788  0.12403473]]
norms (normalize)
 [1. 1. 1. 1. 1.]
from sklearn.datasets import load_iris
iris = load_iris()

data1 = iris.data[:,:2]
data3 = normalize(data1)

In [8]:

sns.jointplot(data1[:,0], data1[:,1])
plt.show()

In [9]:

sns.jointplot(data3[:,0], data3[:,1])
plt.show()



인코딩(Encoding)

인코딩은 카테고리 값이나 텍스트 정보를 처리가 쉬운 정수로 변환하는 과정이다.

One-Hot-Encoder

One-Hot-Encoder는 one-of-K 인코딩이라고도 불리며 0 ~ K-1 의 값을 가지는 정수 스칼라값을 0 또는 1 값을 가지는 K-차원 벡터로 변환한다. 만약 입력이 스칼라가 아니라 벡터이면 각 원소에 대해 인코딩된 결과를 모두 연결한다. 각 원소의 위치 정보는 feature_indices_ 속성에 저장된다. 또 입력이 벡터인 경우에 특정한 열만 카테고리 값이면 categorical_features 인수를 사용하여 인코딩이 되지 않도록 지정할 수 있다. 이 때 인코딩 결과의 순서가 바뀔 수 있으므로 주의한다.

fit 메서드를 호출하면 다음과 같은 속성이 지정된다.

  • n_values_ : 각 변수의 최대 클래스 갯수
  • feature_indices_ : 입력이 벡터인 경우 각 원소를 나타내는 슬라이싱(slice) 정보
  • active_features_ : 실제로 사용된 클래스 번호의 리스트

One-Hot-Encoding 결과는 메모리 절약을 위해 스파스 행렬(sparse matrix) 형식으로 출력된다. 일반적인 배열로 바꾸려면 toarray 메서드를 사용한다.


from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder()


X = np.array([[0], [1], [2]])
X
array([[0],
       [1],
       [2]])


ohe.fit(X)
ohe.n_values_, ohe.feature_indices_, ohe.active_features_
(array([3]), array([0, 3]), array([0, 1, 2]))


ohe.transform(X).toarray()
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])


X = np.array([[0, 0, 4], [1, 1, 0], [0, 2, 1], [1, 0, 2]]) 
X
array([[0, 0, 4],
       [1, 1, 0],
       [0, 2, 1],
       [1, 0, 2]])


ohe.fit(X)
ohe.n_values_, ohe.feature_indices_, ohe.active_features_
(array([2, 3, 5]), array([ 0,  2,  5, 10]), array([0, 1, 2, 3, 4, 5, 6, 7, 9]))


ohe.transform(X).toarray()
array([[1., 0., 1., 0., 0., 0., 0., 0., 1.],
       [0., 1., 0., 1., 0., 1., 0., 0., 0.],
       [1., 0., 0., 0., 1., 0., 1., 0., 0.],
       [0., 1., 1., 0., 0., 0., 0., 1., 0.]])


ohe = OneHotEncoder(categorical_features=[False, True, False])
ohe.fit_transform(X).toarray()
array([[1., 0., 0., 0., 4.],
       [0., 1., 0., 1., 0.],
       [0., 0., 1., 0., 1.],
       [1., 0., 0., 1., 2.]])


ohe.n_values_, ohe.feature_indices_, ohe.active_features_
(array([3]), array([0, 3]), array([0, 1, 2]))



Sigmoid와 Relu

image

  1. sigmoid는 마이너스->0 부분에서 왜곡된 부분을 가지므로
  2. relu가 은닉층에서 마이너스를 모두 0으로 치환시킨 다음
  3. 마지막에만 sigmoid를 activation func으로 써주는게 관례이다.


py파일

깃허브 3. 은행 이탈고객 예측

깃허브 4. 인디안 당뇨병 예측

필요 패키지

깃허브 2. 유방암 남/녀 예측

  1. cython : c계열의 라이브러리 사용 / c방식으로 파이썬 코딩 가능
    - https://anaconda.org/anaconda/cython
    - conda install -c anaconda cython
  2. numpy : 수치 처리 / matrix 계산 가능
  3. pandas : 데이터 과학에 필수적인 dataframe 등을 사용 / csv, 텍스트 파일 등을 사용한다.
  4. keras : 딥러닝 라이브러리, 프론트 엔드를 담당
  5. sklearn : 사이킷런, 파이썬이 기본적으로 제공하는 머신러닝 라이브러리
  6. tensorflow : 딥러닝 백엔드

Sequential과 Dense

Sequential은 선형으로 설명가능한 모델일 경우 사용할 수 있다. 즉, 어떤 선을 기준으로 구분할 수 있을 때이다.
선형 회귀분석용 / 분류용 가설 모델들은 대부분 Sequential을 사용한다.
예를 들어, 암이다 / 암이 아니다.
마이너스 방향으로도 선형으로 설명가능한 모델일 경우, Sequential을 쓰면 된다.

image

Dense는 입력층과 출력층을 모두 연결하는 Layer이다. 그래서 은닉층으로 많이 사용된다.


그외 라이브러리들

  1. sklearn의 cross_validation 클래스 안에 있는 train_test_split
    예를 들어, 100개의 문제가 있는데, 이것을 trainset과 validationset 그리고 testset으로 구분지어야하는 상황이다.
    image
    이 때, 검증셋과 시험셋에 대해서 시험셋에 예측하기 쉬운 것만 들어가서 100점을 맞을 수 있고,
    검증셋에 모르는 것만 들어가서, 학습자체가 제대로 안될 수 있다.
    이 때 생각해낸 것이 여러번 교차적으로 짤라내서 정밀도를 높이는 방법이 교차검증이다.
    image

  2. IPython.display 클래스의  clear_output
    콘솔에 출력할 때, 기존의 내용들을 지운 다음 다시 출력해주는 클래스이다.

  3. sklearn.metrics 클래스의 confusion_matrix
    주로 이진분류에서 사용되는 혼동행렬은, 원래 데이터와 예측값을 출력해주는 오류의 갯수를 나타내는 이진분류 결과표로서
    아래와 같이 생각하면 된다.

                      원래1                               원래2                             원래3
    원래1     원래1 예측1 표본수     원래1 예측2인 표본의 수     원래1 예측3인 표본의 수  -> a/a+b+c : 민감도
    원래2     원래2 예측1 표본수     원래2 예측2인 표본의 수    원래2 예측3인 표본의 수
    원래3     원래3 예측1 표본수     원래3 예측2인 표본의 수    원래3 예측3인 표본의 수
                   d/ d+e+f  = precision

Spyder로 작성한 py 파일

깃허브 2. 유방암 남/녀 예측

Spyder 설치 in anaconda

깃허브 1. 기초

이상하게 노트북에서 아나콘다 통합환경실행 및 Spyder 실행이 안된다...

https://anaconda.org/anaconda/spyder

cmd창에서

conda install -c anaconda spyder

image


Keras

구글 엔지니어가 개발한 것으로, 백엔드로 Tensor나 Theano를 지정할 수 있다.


list와 tuple

[ , , , ] 은 list이다. 하나의 리스트는 [ 0 ]하나로 나타내지만,

(, , , )은 tuple이다. 하나의 튜블은 빈 콤마라도 찍어야한다. ( 0 , )

- list의 대괄호는 생략가능하지만, tuple은 ( , )의 소괄호는 생략해서는 안된다.


keras model

  1. Sequential()은 선형 모델을 사용하겠다는 의미
  2. Dense라는 layers는 input과 output을 모두 연결하는 layer이므로, 은닉층에서 쓰기 좋다.
    - 이 때, 첫번째 파라미터는 output계층의 수이다.
    - 2번째 파라미터는 input계층의 수이다.
  3. complie은 컴퓨터가 알아들을 수 있게 하는 함수인데, 이 때 들어가는 파라미터로 이해하면 쉽다.
    - SGD : <최적화 방식>stochastic gradient Descent 통계적 경사하강의 방법으로 최적의 weight와 bias를 예측한다.
    - mse : <손실 함수> mean square error 평균을 제곱하여 에러를 확장시켜 차이가 명확하게 보이게 한다.
  4. fit은 training, 학습 한다는 의미이다.
    - X, y, 학습횟수, 메세지 출력형태 정도 이다.
  5. predict는 학습을 통해 얻어진 예측값들을 받아오는 함수이다.
    - 이 때, flatten()은 array형태로 얻어지는 예측값(행렬형태)를  1차원 배열로 바꾼 것이다.

  6. 이제 Target값인 y(정해진 답)과  예측한값 predict를 같이 print해서 비교해보자.


예제파일

깃허브 1. 기초

+ Recent posts