리니어 리그레션과 다르게 로지스틱 리그레션은 분류를 위해 모델링된다.
예시로 물건을 구매할사람과 아닌사람을 예상해서 분류할수있다.

# 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)
'머신러닝' 카테고리의 다른 글
| [머신러닝] SVM(Support Vector Machine) (0) | 2022.05.09 |
|---|---|
| [머신러닝] K-Nearest Neighbor (KNN) (1) | 2022.05.06 |
| [머신러닝] Multiple Linear Regression: predict (0) | 2022.05.06 |
| [머신러닝] Linear Regression (0) | 2022.05.06 |
| [머신러닝] 전처리 과정 (Data preprocessing): NaN 처리, Label Encoding, One-hot Encoding, Feature Scaling, train_test_split (0) | 2022.05.05 |
댓글