4. Logistic Regression(로지스틱 회귀)¶
In [1]:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
In [2]:
dataset = pd.read_csv('../data/LogisticRegressionData.csv')
dataset.head()
Out[2]:
hour | pass | |
---|---|---|
0 | 0.5 | 0 |
1 | 1.2 | 0 |
2 | 1.8 | 0 |
3 | 2.4 | 0 |
4 | 2.6 | 0 |
In [3]:
X = dataset.iloc[:, :-1].values # 공부시간 데이터
y = dataset.iloc[:, -1].values # 합격/불합격 데이터
X, y
Out[3]:
(array([[ 0.5],
[ 1.2],
[ 1.8],
[ 2.4],
[ 2.6],
[ 3.2],
[ 3.9],
[ 4.4],
[ 4.5],
[ 5. ],
[ 5.3],
[ 5.8],
[ 6. ],
[ 6.1],
[ 6.2],
[ 6.9],
[ 7.2],
[ 8.4],
[ 8.6],
[10. ]]),
array([0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1],
dtype=int64))
데이터 분리¶
In [4]:
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=0)
학습 (로지스틱 회귀 모델)¶
In [5]:
from sklearn.linear_model import LogisticRegression
classifier = LogisticRegression() # 로지스틱 회귀 모델 생성
classifier.fit(X_train, y_train) # 로지스특 회귀 모델로 학습
Out[5]:
LogisticRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
LogisticRegression()
6시간 공부했을 때 예측?¶
In [6]:
classifier.predict([[6]])
# 결과 1 : 합격할 것으로 예측
Out[6]:
array([1], dtype=int64)
In [7]:
classifier.predict_proba([[6]]) # 합격할 확률 출력
# 불합격 확률 14%, 합격 확률 86%
Out[7]:
array([[0.141483, 0.858517]])
4시간 공부했을 때 예측?¶
In [8]:
classifier.predict([[4]])
# 결과 0 : 불합격할 것으로 예측
Out[8]:
array([0], dtype=int64)
In [9]:
classifier.predict_proba([[4]]) # 합격할 확률 출력
# 불합격 확률 62%, 합격 확률 38%
Out[9]:
array([[0.62497682, 0.37502318]])
분류 결과 예측 (테스트 세트)¶
In [10]:
y_pred = classifier.predict(X_test)
y_pred # 예측 값
Out[10]:
array([1, 0, 1, 1], dtype=int64)
In [11]:
y_test # 실제 값 (테스트 세트)
Out[11]:
array([1, 0, 1, 0], dtype=int64)
In [12]:
X_test # 공부 시간 (테스트 세트)
Out[12]:
array([[ 8.6],
[ 1.2],
[10. ],
[ 4.5]])
In [13]:
classifier.score(X_test, y_test) # 모델 평가
# 전체 테스트 세트 4개 중에서 분류 예측을 올바로 맞힌 개수 3개 -> 3/4 = 0.75
Out[13]:
0.75
데이터 시각화 (훈련 세트)¶
In [14]:
X_range = np.arange(min(X), max(X), 0.1) # X 의 최소값에서 최대값까지를 0.1 단위로 잘라서 데이터 생성 선을 부드럽게 그리김 위함
X_range
C:\Users\ysh\AppData\Local\Temp\ipykernel_9480\355345509.py:1: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)
X_range = np.arange(min(X), max(X), 0.1) # X 의 최소값에서 최대값까지를 0.1 단위로 잘라서 데이터 생성 선을 부드럽게 그리김 위함
Out[14]:
array([0.5, 0.6, 0.7, 0.8, 0.9, 1. , 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7,
1.8, 1.9, 2. , 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3. ,
3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4. , 4.1, 4.2, 4.3,
4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5. , 5.1, 5.2, 5.3, 5.4, 5.5, 5.6,
5.7, 5.8, 5.9, 6. , 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7, 6.8, 6.9,
7. , 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 8. , 8.1, 8.2,
8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9. , 9.1, 9.2, 9.3, 9.4, 9.5,
9.6, 9.7, 9.8, 9.9])
classifier.coef_ * X_range + classifier.intercept_: 선형 결합 z = mx + b
np.exp(-(classifier.coef_ * X_range + classifier.intercept_)): 이 선형 결합에 대해 시그모이드 함수를 적용하는 부분으로 e^-z 를 계산 합니다.
1 / (1 + ...): 시그모이드 함수의 정의로, 확률값 p을 0과 1 사이의 값으로 변환합니다.
In [15]:
#p = 1 / (1 + e^y)
#p = 1 / (1 + np.exp(-(m * X_range + b))
p = 1 / (1 + np.exp(-(classifier.coef_ * X_range + classifier.intercept_))) # y = mx + b
p
Out[15]:
array([[0.01035583, 0.01161118, 0.0130167 , 0.01458984, 0.01634996,
0.01831847, 0.02051904, 0.02297778, 0.0257234 , 0.02878743,
0.03220437, 0.03601184, 0.04025075, 0.04496534, 0.05020326,
0.05601555, 0.06245651, 0.06958349, 0.07745655, 0.08613794,
0.09569142, 0.10618136, 0.1176716 , 0.13022408, 0.14389721,
0.15874395, 0.17480973, 0.19213011, 0.21072838, 0.23061305,
0.25177552, 0.27418791, 0.29780133, 0.32254464, 0.348324 ,
0.37502318, 0.40250484, 0.43061281, 0.45917517, 0.4880083 ,
0.51692146, 0.54572176, 0.57421932, 0.60223222, 0.62959096,
0.65614237, 0.6817526 , 0.70630918, 0.72972211, 0.75192414,
0.77287004, 0.79253536, 0.81091459, 0.82801892, 0.84387392,
0.858517 , 0.87199503, 0.88436205, 0.89567719, 0.90600282,
0.91540298, 0.923942 , 0.93168343, 0.9386892 , 0.94501893,
0.95072949, 0.95587461, 0.96050477, 0.96466704, 0.96840509,
0.97175925, 0.97476661, 0.97746114, 0.97987388, 0.98203308,
0.98396443, 0.9856912 , 0.98723443, 0.98861315, 0.98984449,
0.9909439 , 0.99192526, 0.99280104, 0.99358246, 0.99427954,
0.9949013 , 0.99545578, 0.99595021, 0.99639104, 0.99678404,
0.99713437, 0.99744663, 0.99772494, 0.99797298, 0.99819402]])
In [16]:
p.shape # shape 확인
Out[16]:
(1, 95)
In [17]:
X_range.shape # shpae 확인
Out[17]:
(95,)
In [18]:
p = p.reshape(-1) # 1차원 배열 형태로 변경
# p = p.reshape(len(p))
p.shape
Out[18]:
(95,)
In [19]:
plt.scatter(X_train, y_train, color='blue')
plt.plot(X_range, p, color='green')
plt.plot(X_range, np.full(len(X_range), 0.5), color='red') # X_range 개수만큼 0.5 로 가득찬 배열 만들기
plt.title('Probability by hours')
plt.xlabel('hours')
plt.ylabel('P')
plt.show()
데이터 시각화 (테스트 세트)¶
In [20]:
plt.scatter(X_test, y_test, color='blue')
plt.plot(X_range, p, color='green')
plt.plot(X_range, np.full(len(X_range), 0.5), color='red') # X_range 개수만큼 0.5 로 가득찬 배열 만들기
plt.title('Probability by hours (test)')
plt.xlabel('hours')
plt.ylabel('P')
plt.show()
In [21]:
classifier.predict_proba([[4.5]]) # 4.5 시간 공부했을 때 확률 (모델에서는 51% 확률로 합격 예측, 실제로는 불합격)
Out[21]:
array([[0.48307854, 0.51692146]])
혼동 행렬 (Confusion Matrix)¶
In [22]:
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
cm
# TRUE NEGATIVE (TN) FALSE POSITIVE (FP)
# 불합격일거야 (예측) 합격일거야 (예측)
# 불합격 (실제) 불합격 (실제)
# FALSE NEGATIVE (FN) TRUE POSITIVE (TP)
# 불합격일거야 (예측) 합격일거야 (예측)
# 합격 (실제) 합격 (실제)
Out[22]:
array([[1, 1],
[0, 2]], dtype=int64)
'Python > SikitLearn' 카테고리의 다른 글
05. (비지도학습)_K-Means (0) | 2024.11.23 |
---|---|
03. (지도학습)_Polynomial Regression(다항 회귀) (0) | 2024.11.23 |
02. (지도학습)_Multiple Linear Regression(다중 선형 회귀) (0) | 2024.11.23 |
01. (지도학습)_Linear Regression(선형 회귀) (0) | 2024.11.23 |