본문 바로가기

Python-머신러닝

Logistic Regression 로지스틱 회귀: Confusion Matrix, accuracy_score(), classification_report()

반응형

 

 

- 데이터에 피팅하는 것이 리그레션.

- 분류의 문제에 리그레이션을 이용해서, 분류를 해보겠다.

- 연비예측/연봉 예측이 아닌 다른 부류의 문제.

 

- 데이터 종류에 나이, 이메일 클릭 여부가 있다. 해당 나잇대 사람이 내가 보낸 메일을 클릭 여부를 예측하는 것. 

- 예측을 두가지로 분류한 것. 클릭할 것인가, 아닌가.

supervised -> classification -> logistic regression



- 해당 문제는 직선의 방적식으로 해결하기에는 오차가 많이 발생할 것 같더라. 

그러니, 곡선으로 하자. 

- 액션의 0과 1이 바로 레이블이다.

- 레이블이 있다는 것은, 수퍼바이저드 러닝이라는 뜻

 

- 데이터를 피팅해야하니까, 방정식을 만든다. 

- 이렇게 비슷하게 생긴 함수가 이미 존재한다. 이름은 sigmoid function (시그모이드 함수)

 

- 시그모이드 함수의 특징은, 0을 넣었을 때, x= 0은 y = 0.5이며, x가 마이너스로  갈수록 y = 0에 가까워진다. x가 정수로 더 나아갈수록 y=1에 가까워진다. 

- 최종 예측값은 0과 1이다. 

- 대칭이다.

 

- 리그레이션 : 직선의 방정식

- 따라서 리니어 리그레션 식을, y 값을 시그모이드에 대입해서, 일차방정식으로 만들면 다음과 같아진다.

- 위와 같은 식을 가진 regression을, Logistic Regression이라 한다. 

- P는 확률을 나타낸다.


ex) 나이와 연봉으로 분석해서, 물건을 구매할지 안할지를 분류하자!!

 

 

- Nan 확인

- 나이랑 연봉정보를 주면, 구매 여부를 예측하도록 함

df.isna().sum()

X = df.loc[:, 'Age' : 'EstimatedSalary']
y=df['Purchased']

 

- 피쳐스케일링 한다.

- 리니얼 레그레션은 자체적으로 피쳐스케일링이 되었으나, 지금 사용하려는 레그레션은 직접 진행해야한다.

- 표준화 방법으로 피쳐스케일링 진행해보도록 한다.

from sklearn.preprocessing import StandardScaler, MinMaxScaler

scaler = StandardScaler()
X = scaler.fit_transform(X)

- y는 0과 1로 되어있어서, 피쳐스케일링을 진행하지 않는다. 

 

-  학습용과 테스트용으로 데이터를 나눈다.

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, random_state= 10)

 

- 분류의 문제이므로, 로지스틱 리그레션으로 모델링

- 리니얼 리그레션에서 사용하면 안된다. 

- 분류므로 보통은 하기 변수명(classifier)을 많이 사용한다.

from sklearn.linear_model import LogisticRegression

classifier = LogisticRegression()

 

-  학습 시킨다.

classifier.fit(X_train,y_train)

 

-  성능평가

- 현재 인공지능의 이름은 classifier

ㄴ 학습에 필요한 데이터가 이 변수안에 들어있다. 

ㄴ 예측해봐라.

y_pred = classifier.predict(X_test)

 

- 실제로는 클릭했으나, 클릭하지 않았다고 예측하면, 틀린 것. 



Confusion Matrix

- 두 개의 클래스로 분류하는 경우는 아래와 같다.

 

 

- 제조업체 같은 경우: 

ㄴ 불량 여부 판별하는 소프트웨어가 중요.

ㄴ 정확도도 중요하나, 예측을 불량이라고 한 것중에, 실제 불량이 더 많은 게 더 중요하다. 

ㄴ실제 불량이 퍼센트가 더 높을수록 더 좋다. (정밀도)

 

- 카드 회사 같은 경우: 

ㄴ 정상거래냐, 사기거래냐

ㄴ 실제로는 사기인데, 사기라고 정확하게 탐지한 그 수치가 커야한다. 

ㄴ 포커싱이 적중률에 맞춰진다.

 

from sklearn.metrics import confusion_matrix

cm = confusion_matrix(y_test, y_pred)

- 분류같은 경우, 실제와 예측의 성능 평가할 때, 

실제는 행으로 쓰고, 예측을 컬럼으로 사용한다. 

-> 외워야한다.

 

- Confusion Matrix: 표로 나타내고, 정확도 판단을 한다. 

- 옳게 판단한 것: (0,0), (1,1)의 합 /전체개수

 

- 정확도 계산

ㄴ (48+23)/cm.sum()

ㄴ 계산을 해주는 라이브러리를 이용하면 편하다.

from sklearn.metrics import accuracy_score

accuracy_score(y_test,y_pred)

 

- 보고 할때는 하기처럼 보고하는 것이 좋다.

from sklearn.metrics import classification_report

print(classification_report(y_test,y_pred))



- 그래프로 표시

import seaborn as sb

sb.heatmap(data = cm, cmap = 'RdPu', annot = True)
plt.show()




ex) 신규 고객이 들어왔습니다. 이 사람은 우리 상품을 구매할것 같은지 예측을 해보세요. 연봉은 27500달러이고, 나이는 34살입니다.

 

 

new_data = np.array([34,27500])

X_train.shape
new_data.shape

new_data = new_data.reshape(1,2)

new_data = new_data.astype(float)

new_data = scaler.transform(new_data)

classifier.predict(new_data)







반응형