로지스틱 회귀
독립 변수의 선형 결합을 이용하여 사건의 발생 가능성을 예측하는 데 사용되는 통계 기법
종속 변수와 독립 변수간의 관계를 구체적인 함수로 나타내어 향후 예측 모델에 사용하는 것
선형 회귀 분석과는 다르게 종속 변수가 범주형 데이터를 대상으로 하며 입력 데이터가 주어졌을 때 해당 데이터의 결과가 특정 분류로 나뉘기 때문에 일종의 분류 기법으로도 볼 수 있음
회귀를 사용하여 데이터가 어떤 범주에 속할 확률을 0에서 1 사이의 값으로 예측하고 그 확률에 따라 가능성이 더 높은 범주에 속하는 것으로 분류해주는 지도 학습 알고리즘
데이터가 특정 범주에 속할 확률을 예측하기 위해 거쳐야 하는 단계
1. 모든 속성(feature)들의 계수(coefficient)와 절편(intercept)을 0으로 초기화
2. 각 속성들의 값(value)에 계수(coefficient)를 곱해서 log-odds를 구함
3. log-odds를 sigmoid 함수에 넣어서 [0, 1] 범위의 확률을 구함
각 속성(feature)들의 계수 log-odds를 구한 후 Sigmoid 함수를 적용하여 실제로 데이터가 해당 클래스에 속할 확률을 0과 1사이의 값으로 나타냄
log-odds
우선 odds부터 계산해야 함
odds = (사건이 발생할 확률) / (사건이 발생하지 않을 확률)
여기서 log를 취한 것이 log-odds
그러나 로지스틱 회귀에서는 여러 속성(feature)들에 계수(coefficient)를 곱하고 절편(intercept)을 더해서 최종 값 log-odds를 구해야하기 때문에 까다로움
여기서는 dot product 방식으로 log-odds를 계산
log_odds = np.dot(features, coefficients) + intercept
Sigmoid
log-odds를 sigmoid 함수에 넣어 0부터 1사의 값으로 변환
Log Loss
손실함수(Loss function)는 머신러닝 모델이 얼마나 잘 예측하는지 확인하는 방법으로, 로지스틱 회귀의 손실함수는 LOg Loss
즉, 구해놓은 속성들의 계수(coefficients)와 절편(intercept)이 적절한지 확인하기 위해 손실(loss)을 고려해야 함
모델의 적합성을 평가하기 위해 각 데이터 샘플의 손실(모델 예측이 얼마나 잘못되었는지)을 계산한 다음 그것들의 평균화 해야 함
- m: 데이터 총 개수
- y_i: 데이터 샘플 i의 분류
- z_i: 데이터 샘플 i의 log-odd
- h(z_i): 데이터 샘플 i의 log-odd의 sigmoid (즉, 데이터 샘플 i가 분류에 속할 확률)
로지스틱 회귀 모델의 목표
로지스틱 함수를 구성하는 계수와 절편에 대해 Log Loss(로그 손실)을 최소화하는 값을 찾는 것
정확한 예측은 손실이 거의 없지만, 잘못된 예측은 큰 손실을 초래하기에
올바른 예측을 하면서 손실이 작아지는 모델에 가까워지도록 하는 게 목표가 될 것
그래서 선형 회귀와 마찬가지로 경사하강법(Gradient Descent)을 사용하여 모든 데이터에서 로그 손실(Log Loss)을 최소화 하는 계수를 찾을 수 있음
Classification Threshold
데이터가 클래스에 속할지 말지 결정할 확률 컷오프를 임계값(Threshold)
기본 값은 0.5지만 데이터의 특성이나 상황에 따라 조정 가능
Iris 종 분류
from sklearn.datasets import load_iris
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['species'] = pd.Series(iris.target)
df.info()
sdf = pd.DataFrame()
sdf['petal_length'] = df['petal length (cm)']
sdf['species'] = df['species']
sdf = sdf[:100]
sdf.info()
sns.regplot(x='petal_length', y='species', data=sdf, logistic=True)
plt.show()
#학습 데이터, 테스트 데이터 나누기
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(sdf.iloc[:, :1], sdf.iloc[:, 1], test_size=0.33)
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train)
print(model.coef_, model.intercept_)
X = np.linspace(1,sdf['petal_length'].max(),1000)
z = model.coef_[0][0] * X + model.intercept_[0]
Y = sigmoid(z)
plt.scatter(sdf['petal_length'], sdf['species'])
plt.plot(X, Y, 'r')
plt.show()
from sklearn.metrics import classification_report, confusion_matrix
def dispConfusionMatrix(y_true, y_pred):
sns.heatmap(confusion_matrix(y_true, y_pred), annot=True )
plt.xlabel('Predicted')
plt.ylabel('Ground truth')
plt.show()
dispConfusionMatrix(y_train, model.predict(X_train))
print(classification_report(y_train, model.predict(X_train)))
dispConfusionMatrix(y_test, model.predict(X_test))
print(classification_report(y_test, model.predict(X_test)))
<참고: 타이타닉 파이썬 코드>
https://hleecaster.com/ml-logistic-regression-example/
출처
https://ko.wikipedia.org/wiki/%EB%A1%9C%EC%A7%80%EC%8A%A4%ED%8B%B1_%ED%9A%8C%EA%B7%80
'Study > AI' 카테고리의 다른 글
[AI][ML]SVM(Support Vector Machine) (0) | 2022.08.10 |
---|---|
[AI][ML]k-최근접 이웃 알고리즘(KNN, K-Nearest Neighbor) (0) | 2022.08.09 |
[AI][ML]회귀(Regression) (0) | 2022.07.29 |
[AI][ML]상관계수 (0) | 2022.07.20 |
[AI][ML]데이터 스케일링 (0) | 2022.07.20 |