본문 바로가기
머신러닝

[머신러닝] Logistic Regression, Dealing NaN

by eyoo 2022. 5. 6.

리니어 리그레션과 다르게 로지스틱 리그레션은 분류를 위해 모델링된다.

예시로 물건을 구매할사람과 아닌사람을 예상해서 분류할수있다.

 

# 0.5 를 기준으로 0과 1로 나누는 과정

 

 

나이와 연봉을 분석해서 물건을 구매할지 안할지 분류하자

 

df=

 

데이터를 기반으로 트레인 테스트 스플릿 과정까지 진행하자.

 

df.isna().sum()  #Nan 없음

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

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X = scaler.fit_transform(X)

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=3)

NaN 처리 

# 간혹 나이와 같은 일정한 범위의 수가 나와야 하는 데이터에 0 혹은 다른 예상하지 못한 엉뚱한 데이터가 들어있을수 있다.

# 그럴때마다 그 데이터를 찾고 replace와 np.nan을 사용해 NaN으로 바꾸고 (replace(0,np.nan))

# Nan을 모두 없애거나, Nan을 다른 값으로바꿔줘야 한다. 가장 많이 사용하는 방법은 Nan을 각 컬럼의 평균으로 바꾸는 방법이다. (X = X.fillna(X.mean()))

 

 

구매여부를 분류해야하므로 로지스틱 리그레션으로 모델링한다.

 

from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression()
classifier.fit(X_train, y_train)

# 방식은 리니어 리그레션과 비슷하다.

 

 

이제 인공지능의 성능을 평가 해야하는데,

로지스틱 리그레션은 리니어 리그레션과 다른 방식으로 평가해야 한다.

 

먼저 예상값을 구하자

 

y_pred = classifier.predict(X_test)

 

 

confusion_matrix를 사용해서 분류결과표를 나타낼수있다.

 

in:

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
cm

out:

array([[51,  4],
       [ 8, 17]], dtype=int64)

# 이때 표의 행부분은 실제값이며 위에서부터 0, 1을 표시한다.

# 또한 열부분은 예측값이며 왼쪽에서부터 0, 1을 표시한다.

# 표의 순서대로 A, B, C, D로 분류할경우 A와 D가 실제값 예측에 성공한 부분이다.

 

 

컨퓨전 매트릭스를 통해 직접적으로 정확도를 계산할수있다. 

 

in:

(51+17)/cm.sum()

out:

0.85

# 표의 마이너스방향의 대각선방향 수치를 전체 값으로 나눠주면 된다.

 

 

accuracy_score를 사용하면 식을 세우지 않고 바로 정확도를 나타낼수있다.

 

in:

from sklearn.metrics import accuracy_score
accuracy_score(y_test,y_pred)

out:

0.85

# 실제값을 첫번째로, 예측값을 두번째에 넣는다.

 

 

classification_report를 사용하면 간단히 정확도를 포함하여 정밀도(precision)와 적중율(recall)을 알수있다.

 

in:

from sklearn.metrics import classification_report
print(classification_report(y_test,y_pred))

out:

              precision    recall  f1-score   support

           0       0.86      0.93      0.89        55
           1       0.81      0.68      0.74        25

    accuracy                           0.85        80
   macro avg       0.84      0.80      0.82        80
weighted avg       0.85      0.85      0.85        80

 

 

# 상황에 따라, 정밀도가 필요할때가 있고, 적중율이 필요할때가 있다.

# 예측을 한 불량 중 실제 불량은 얼마나 되는지: 정밀도 (예시: 제조업체 불량율)

# 실제로 사기인것 중 정확히 사기라고 탐지한것:  적중율 (예시: 카드회사 사기거래 포착)

 

 

또한 컨퓨전 매트릭스를 차트로 나타낼수있다.

 

in:

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

out:

 

 

아래는 테스트 데이터로 나온 예측 결과를 정확하게 나타내는 방법이다. (참고만 하도록)

 

in:

# Visualising the Test set results
from matplotlib.colors import ListedColormap
X_set, y_set = X_test, y_test
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
                     np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
plt.figure(figsize=[10,7])
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
             alpha = 0.75, cmap = ListedColormap(('red', 'green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
    plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                c = ListedColormap(('red', 'green'))(i), label = j)
plt.title('Classifier (Test set)')
plt.xlabel('Age')
plt.ylabel('Estimated Salary')
plt.legend()
plt.show()

out:

# 공간 속, 다른 색의 점이 있는경우가 오차이다.

 

 

리니어 리그레션과 마찬가지로 모델링된 인공지능을 활용해 가지고있는 데이터를 토대로 분류(예측)할수있다.

 

신규고객이 들어왔다. 이 사람은 우리 상품을 구매할까?

연봉 27500, 나이 34세

 

1. 먼저 데이터의 순서대로 2차원 배열을 만든다.

 

in:

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

out:

# 1차원 행렬을 만든 후 reshape을 사용해 2차원으로 바꿔줄수도 있다.

 

 

2. 앞서 학습했던 데이터들이 scaler변수를 통해 정규화 방식으로 스케일링되었으니 똑같은 변수로 스케일링 해준다.

 

in:

s_scaler.transform(a)

out:

array([[-0.34910049, -1.24044495]])

 

 

3. 그 후, 로지스틱 리그레션으로 사용했던 classifier변수를 사용해 predict한다.

 

in:

classifier.predict(a)

out:

array([1], dtype=int64)
 
# 물건을 구매한다고 분류된다.
 
 
 
 
 

댓글