반응형

1. 로지스틱 회귀분석

로지스틱 회귀(Logistic Regression)는 주로 이진 분류(binary classification) 문제를 다루는 머신러닝 알고리즘 중 하나입니다. 이 알고리즘은 선형 회귀(Linear Regression)와 달리 종속 변수가 이항 분포(binomial distribution)를 따르며, 결과값이 0 또는 1인 경우에 사용됩니다. 예를 들어, 고객이 제품을 구매할지 여부, 메일이 스팸인지 아닌지, 환자가 양성 종양을 가지고 있는지 여부 등을 예측하는 데 활용됩니다.

 

2. 파이썬 코드 예제

1) 데이터 불러오기

# 필요한 라이브러리 임포트
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix

# breast_cancer 데이터셋 로드
data = load_breast_cancer()
X = data.data
y = data.target

 

breast_cancer 데이터셋은 유방암 진단에 관련된 특성을 담고 있는 데이터셋입니다. 이 데이터셋은 유방암 세포의 특징을 기반으로 악성(malignant)과 양성(benign) 종양을 분류하는 문제를 다룹니다. 해당 데이터셋은 미국 위스콘신 대학의 Dr. William H. Wolberg가 수집한 Fine Needle Aspirate(FNA) 검사 결과를 기반으로 만들어졌습니다.

  1. 반지름(Radius): 세포 핵의 평균 반지름.
  2. 질감(Texture): 회색조 값의 표준편차.
  3. 둘레(Perimeter): 세포 핵의 둘레 길이.
  4. 면적(Area): 세포 핵의 면적.
  5. 비율(Compactness): 둘레^2 / (면적 - 1.0).
  6. 곱셈(Mean concavity): 세포 핵의 평균 오목함.
  7. 오목점(Mean concave points): 세포 핵의 평균 오목한 지점의 수.
  8. 대칭(Symmetry): 대칭성.
  9. 프랙탈 차원(Fractal dimension): 프랙탈 차원.

각 특성은 평균(mean), 표준오차(standard error), 최대값(worst)의 세 가지 측정값으로 제공됩니다. 이 데이터셋은 569개의 샘플로 이루어져 있습니다.

 

2) 학습용(training)과 테스트용(test)으로 나누기

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

 

이 과정은 모델을 훈련시키고 나서 모델의 성능을 평가하기 위해 데이터를 분리하는 데 사용됩니다. train_test_split 함수는 데이터를 80%의 학습 데이터와 20%의 테스트 데이터로 분할합니다. 이렇게 나누어진 데이터는 각각 X_train, X_test, y_train, y_test에 저장되며, 이를 활용하여 모델을 훈련하고 평가합니다. 데이터셋이 상대적으로 작을 때 7:3의 비율을 사용하고 일반적으로 8:2의 비율을 사용합니다. random_state는 데이터를 무작위로 섞거나 분할할 때 사용되는 난수 발생기의 시드(seed) 값입니다. 난수 발생기는 초기 시드 값을 기반으로 난수를 생성하며, 동일한 시드 값을 사용하면 항상 동일한 난수가 생성됩니다.

 

3) 모델 만들기

# 로지스틱 회귀 모델 생성 및 학습
model = LogisticRegression()
model.fit(X_train, y_train)

# 테스트 데이터 예측
y_pred = model.predict(X_test)

 

# 정확도 및 혼동 행렬 출력
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)

print(f'Accuracy: {accuracy}')
print('Confusion Matrix:')
print(conf_matrix)
Accuracy: 0.9649122807017544
Confusion Matrix:
[[40  3]
 [ 1 70]]

- 정확도가 약 0.96으로 굉장히 높게 나왔습니다. 정확도는 전체 예측 중 올바르게 예측한 비율을 나타냅니다. 정확도는 다음과 같이 계산됩니다: Accuracy=올바른 예측 수전체 예측 수 ÷ 

혼동 행렬은 모델의 성능을 더 세부적으로 평가하기 위한 표입니다. 이는 각 클래스에 대해 모델이 얼마나 맞추었는지, 틀렸는지를 나타냅니다. 혼동 행렬은 예측값과 실제값을 기반으로 다음과 같이 구성됩니다.

출처: 나무위키

  1. True Negative (TN )
    • 실제 값이 Negative이고 모델이 Negative로 예측한 경우입니다.
    • 예를 들어, 실제로 건강한 사람을 건강한 것으로 정확하게 예측한 경우입니다.
  2. False Positive (FP )
    • 실제 값이 Negative이지만 모델이 Positive로 잘못 예측한 경우입니다.
    • 예를 들어, 실제로 건강한 사람을 질병이 있는 것으로 잘못 예측한 경우입니다.
  3. False Negative (FN)
    • 실제 값이 Positive이지만 모델이 Negative로 잘못 예측한 경우입니다.
    • 예를 들어, 실제로 질병이 있는 사람을 건강한 것으로 잘못 예측한 경우입니다.
  4. True Positive (TP)
    • 실제 값이 Positive이고 모델이 Positive로 정확하게 예측한 경우입니다.
    • 예를 들어, 실제로 질병이 있는 사람을 정확하게 질병이 있는 것으로 예측한 경우입니다.

5) 회귀 계수 그래프

# 회귀계수 그래프
plt.figure(figsize=(12, 6))
plt.bar(range(len(model.coef_[0])), model.coef_[0], color='green', alpha=0.7)
plt.title('Logistic Regression Coefficients')
plt.xlabel('Feature Index')
plt.ylabel('Coefficient Value')
plt.show()

 

로지스틱 회귀 모델에서 각 특성(feature)의 회귀 계수(coefficients)를 시각화한 것입니다. 로지스틱 회귀에서는 각 특성의 가중치를 나타내는 회귀 계수가 있으며, 이 값은 해당 특성이 모델의 예측에 얼마나 영향을 미치는지를 나타냅니다.

 

여기서 하나 고민할 문제가 있습니다. 모든 변수를 사용할 경우 다중공선성 문제로 인해 제대로 된 문제를 만들 수 없게 됩니다.다중공선성(multicollinearity)은 회귀 분석에서 독립 변수들 간에 강한 선형 의존성이 있는 경우 발생하는 문제를 나타냅니다. 즉, 하나의 독립 변수가 다른 독립 변수들의 조합으로 잘 예측될 수 있는 상황을 의미합니다. 아래는 상관계수가 낮은 변수만을 활용하여 동일한 분석을 진행한 코드 예시입니다.

import numpy as np
import pandas as pd
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix

# breast_cancer 데이터셋 로드
data = load_breast_cancer()
X = data.data
y = data.target

# 데이터프레임 생성
df = pd.DataFrame(X, columns=data.feature_names)
df['target'] = y

# 상관 계수가 일정 임계값 이하인 변수 선택
threshold = 0.3  # 임계값 설정 (상관 계수의 절대값이 이 값 이하인 변수 선택)
corr_matrix = df.corr().abs()
lower_tri = corr_matrix.where(np.tril(np.ones(corr_matrix.shape), k=-1).astype(np.bool))
to_drop = [column for column in lower_tri.columns if any(lower_tri[column] < threshold)]

# 상관 계수가 일정 임계값 이하인 변수만 선택
X_selected = df.drop(columns=to_drop)
y_selected = df['target']

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X_selected, y_selected, test_size=0.2, random_state=42)

# 로지스틱 회귀 모델 생성 및 학습
model = LogisticRegression()
model.fit(X_train, y_train)

# 테스트 데이터 예측
y_pred = model.predict(X_test)

# 정확도 및 혼동 행렬 출력
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)

print(f'Accuracy: {accuracy}')
print('Confusion Matrix:')
print(conf_matrix)
Accuracy: 1.0
Confusion Matrix:
[[43  0]
 [ 0 71]]

 

반응형
Posted by 마르띤
,
반응형

0. 개요

보스턴 주택 가격 데이터셋은 머신 러닝과 회귀 분석 연습용으로 널리 활용되는 데이터셋 중 하나입니다. 이 데이터셋은 미국 매사추세츠주 보스턴 내 다양한 지역의 주택 가격과 주택 가격에 영향을 미치는 여러 가지 특성들을 포함하고 있습니다. 주로 회귀 분석의 예제로 사용되며, 집값을 예측하는 모델을 만들기 위한 데이터로 활용됩니다. 이 데이터셋은 Scikit-learn 라이브러리에 기본으로 내장되어 있어서 불러와서 사용할 수 있는데, 해당 파일을 블로그에도 첨부하였으니 자유롭게 다운하셔도 됩니다. 주요 칼럼값은 아래와 같습니다.

 

- CRIM: 지역별 1인당 범죄율

- ZN: 25,000 평방피트당 주거용 토지 비율

- INDUS: 비소매상업지역 면적 비율

- CHAS: 찰스 강 인접 여부 (1: 강 인접, 0: 강 미인접)

- NOX: 일산화질소 농도 RM: 주택당 평균 방 개수

- AGE: 1940년 이전에 건축된 주택의 비율

- DIS: 5개의 보스턴 고용 센터와의 거리에 대한 가중치

- RAD: 방사형 고속도로 접근성 지수

- TAX: $10,000당 재산세율

- PTRATIO: 학생-교사 비율

- B: 1000(Bk - 0.63)^2, 여기서 Bk는 지역별 흑인 비율

- LSTAT: 저소득 계층의 비율

- MEDV: 주택 가격의 중앙값

 

이 데이터셋을 활용하여 다양한 회귀 모델을 학습하고 집값을 예측하는 연습을 할 수 있습니다. 데이터의 다양한 특성을 이해하고 활용하여 모델을 개선하며, 데이터 분석 및 예측 능력을 향상시킬 수 있는 좋은 예제 중 하나입니다.

 

1. 파이썬 코드 - 회귀분석

#라이브러리 불러오기
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

#데이터 불러오기
boston_data = pd.read_csv('HousingData.csv')

#결측치 확인 및 제거
boston_data.isnull().sum()
boston_data = boston_data.dropna(axis=0)

#데이터 분할
X=boston_data.drop('MEDV',axis=1)
y=boston_data['MEDV']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 선형 회귀 모델 생성 및 학습
model = LinearRegression()
model.fit(X_train, y_train)

#테스트 데이터에 대한 예측
y_pred = model.predict(X_test)

# 평가: 평균 제곱 오차(Mean Squared Error) 계산
mse = mean_squared_error(y_test, y_pred)
print(f'Mean Squared Error: {mse:.2f}')

 

2. 탐색적 데이터 분석(EDA)

1) 데이터 구조

boston_data.head()

CRIM부터 MEDV까지 총 14개의 칼럼값을 가지고 있습니다.

 

2) 상관 분석

# 상관 분석 시각화
correlation_matrix = boston_data.corr()
plt.figure(figsize=(12, 8))
sns.heatmap(correlation_matrix, annot=True)
plt.title('Correlation Matrix')
plt.show()

- 'RM' (방 개수)은 'MEDV' (주택 가격)와 양의 상관 관계를 가지는 밝은 색을 보여줍니다. 이는 방의 개수가 증가할수록 주택 가격도 증가하는 경향을 나타냅니다.

- 'LSTAT' (저소득 계층의 비율)은 'MEDV'와 음의 상관 관계를 가집니다. 이는 저소득 계층의 비율이 높을수록 주택 가격이 낮아지는 경향을 나타냅니다.

- 'RAD' (방사형 고속도로 접근성 지수)와 'TAX' ($10,000당 재산세율)는 서로 강한 상관 관계를 보입니다. 

 

 

3) 주택 가격 분포

# 주택 가격 분포
plt.figure(figsize=(8, 6))
sns.histplot(data=boston_data, x='MEDV', bins=30, kde=True)
plt.title('Distribution of Housing Prices (MEDV)')
plt.show()

4) 방 개수와 주택 가격간 관계

# 방 개수와 주택 가격 분포
plt.figure(figsize=(8, 6))
sns.scatterplot(data=boston_data, x='RM', y='MEDV')
plt.title('Relationship between Rooms (RM) and Housing Prices (MEDV)')
plt.show()

3. 결측값 확인

파이썬에서 결측값을 확인하고 처리하는 방법은 데이터 전처리 과정에서 중요한 부분입니다.

boston_data.isnull().sum()

 

결측값을 지우는 방법도 있고, 평균이나 최빈값으로 대체하는 방법도 있는데 나는 지우는 방법을 선택하였습니다.

boston_data = boston_data.dropna(axis=0)

 

4. 모델 성능 평가

1) 성능 평가

# 평가: 평균 제곱 오차(Mean Squared Error) 계산
mse = mean_squared_error(y_test, y_pred)
print(f'Mean Squared Error: {mse:.2f}')
Mean Squared Error: 31.45
 

 

파이썬 머신러닝에서 모델 성능 평가는 매우 중요한 이유가 있습니다. 모델의 성능을 평가하는 것은 모델이 얼마나 좋은 예측을 하는지를 이해하고 개선하는 데 도움을 주는 핵심적인 단계입니다.

 - 비즈니스 의사 결정에 활용: 머신러닝 모델은 비즈니스 의사 결정을 지원하는 데 사용될 수 있습니다. 모델의 예측 능력이나 신뢰도를 평가함으로써, 예를 들어 상품 판매 예측, 금융 리스크 평가 등과 같은 중요한 결정에 도움을 줄 수 있습니다.

- 성능 개선: 성능 평가를 통해 모델의 약점이나 부족한 부분을 파악하고 개선할 수 있습니다. 예측의 정확도를 높이거나 편향을 줄이는 등 모델을 보다 강력하게 만들기 위한 방법을 찾을 수 있습니다.

- 과적합 및 과소적합 판단: 모델 성능 평가는 과적합(Overfitting)이나 과소적합(Underfitting)과 같은 문제를 판단하는데 도움을 줍니다. 훈련 데이터에 대한 예측 능력과 테스트 데이터에 대한 예측 능력을 비교하여 모델의 일반화 능력을 평가할 수 있습니다.

- 모델 해석: 모델의 성능 평가 결과는 모델이 어떤 특성을 중요하게 생각하는지, 어떤 특성이 예측에 큰 영향을 주는지 등을 파악하는 데 도움을 줍니다.

 

2) 시각화 - 실제값과 예측값을 비교하는 그래프

#라이브러리 
import matplotlib.pyplot as plt

#그래프 설정
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, color='blue')
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], linestyle='--', color='red', linewidth=2)
plt.xlabel('Actual Price')
plt.ylabel('Predicted Price')
plt.title('Actual vs Predicted House Prices')
plt.show()

 

HousingData.csv
0.03MB

반응형
Posted by 마르띤
,
반응형

0. 개요

- 타이타닉 사건: 타이타닉은 역사상 가장 유명한 해상 사고 중 하나로, 1912년 4월 15일에 발생한 비극적인 사건

- 타이타닉 데이터셋은 머신 러닝과 데이터 분석 분야에서 많이 활용되는 이유는 여러 가지가 있습니다. 이해하기 쉬운 구조와 다양한 특성들로 구성되어 있어 머신 러닝의 기본 개념을 학습하고 모델을 구축하는 데 사용하기에 적합합니다.  타이타닉 데이터셋은 생존 여부를 예측하는 이진 분류 문제로도 활용되고, 승객의 나이나 운임 등을 예측하는 회귀 문제로도 활용될 수 있습니다. 이로 인해 다양한 머신 러닝 알고리즘과 기법을 연습할 수 있습니다. 이러한 이유들로 인해 타이타닉 데이터셋은 머신 러닝과 데이터 분석의 입문자부터 전문가까지 다양한 수준의 사람들에게 인기있는 연습 및 학습용 데이터셋 중 하나로 널리 사용되고 있습니다. 

 

1. 파이썬 코드

#라이브러리 불러오기
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

#데이터 불러오기
titanic_data = pd.read_csv('titanic.csv')

#필요한 열값만 선택
features = ['Survived', 'Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']

#결측치 처리 및 범주형 데이터 변환
titanic_data = titanic_data[features].dropna()
titanic_data['Sex'] = titanic_data['Sex'].map({'male': 0, 'female': 1})
titanic_data['Embarked'] = titanic_data['Embarked'].map({'S': 0, 'C': 1, 'Q': 2})

#X값 Y값 정의 
X = titanic_data.drop('Survived', axis=1)
y = titanic_data['Survived']

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 머신러닝 모델 - 랜덤포레스트 생성 및 학습
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)

# 테스트 데이터에 대한 예측
y_pred = model.predict(X_test)

# 정확도 평가
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')

 

2. 탐색적 데이터 분석(EDA)

1) 데이터가 어떻게 생겼는지 확인

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 데이터 불러오기
titanic_data = pd.read_csv('titanic.csv')

# 데이터의 일부를 살펴봅니다.
titanic_data.head()

 

대부분의 칼럼값은 이름만 봐도 쉽게 알 수 있다. 가장 중요한 survived는 생존 유무인데 1이 생존이다.  sibsp 형제 혹은 부부의 수이고 parch는 부모 혹은 자녀의 수이다.

 

2) 생존자와 사망자의 수 확인

sns.countplot(x='Survived', data=titanic_data)
plt.title('Survivors vs. Non-Survivors')
plt.show()

 

 

3) 성별에 따른 생존 여부 확인

sns.countplot(x='Survived', hue='Sex', data=titanic_data)
plt.title('Survivors and Non-Survivors by Sex')
plt.show()

 

 

4) 나이 분포 확인

sns.histplot(data=titanic_data, x='Age', bins=20, kde=True)
plt.title('Age Distribution')
plt.show()

3. 머신러닝 - 랜덤포레스트(Random Forest)

이번 모델링에서는 랜덤 포레스트를 활용하였습니다. 랜덤 포레스트는 머신 러닝 알고리즘 중 하나로, 앙상블 학습 방법 중의 하나입니다. 앙상블 학습은 여러 개의 간단한 모델을 결합하여 더 강력하고 안정적인 모델을 만드는 기법으로, 랜덤 포레스트는 이 중에서 대표적인 알고리즘입니다. 

 

랜덤 포레스트는 마치 여러 명의 전문가들이 함께 의사 결정을 내리는 것과 비슷합니다. 각 전문가는 다른 정보를 가지고 있고, 각자의 의견을 내놓습니다. 그런 다음, 모든 의견을 모아서 가장 현명한 결정을 내리는 방식입니다.

 

랜덤 포레스트는 컴퓨터에게 이런 방식을 가르쳐서 데이터를 예측하게 만든 것입니다. 데이터를 여러 조각으로 나누어서 작은 모델들이 각각 조각을 예측하도록 합니다. 그리고 이 작은 모델들의 의견을 모아서 예측 결과를 만들어 내죠. 이렇게 함으로써 하나의 모델보다 더 똑똑하고 정확한 예측을 할 수 있답니다. 그리고 랜덤 포레스트는 모델이 예측을 할 때, 일부 정보만을 사용하게 됩니다. 마치 몇몇 정보만 보고 결정을 내리는 것처럼요. 이렇게 함으로써 각각의 작은 모델이 더 다양한 측면을 보게 되고, 전체적으로 더 좋은 예측을 할 수 있게 되는 것이죠. 랜덤 포레스트는 간단하게 말하면 다양한 의견을 모아서 더 현명한 결정을 내리는 방법이라고 생각하시면 됩니다. 이렇게 하면 데이터 예측이 더 정확해지고 안정적으로 작동하게 되는 거죠!

 

4. 머신러닝과 예측분석

처음 머신러닝을 공부할 때 결과값 0.78만 나오고 이게 뭔가? 하였다. 결국은 내가 만든 모델을 가지고 평가를 해야하고 랜덤포레스트가 최적의 선택이었는지, 또 테스트 사이즈가 20%로 설정되었는데 이 보다 더 나은 방법은 없는지도 고민해봐야 한다. 

 

그리고 이번 데이터 분석 결과가 0.78이라고 나왔는데, 실제 데이터 셋에서 그러니까 y값 survived가 없는 상태에서 데이터를 인풋 하였을 때, 그러니까 성별, 연령,함께 탄 가족 수, 좌석 등급 등 x값을 넣었을 때 얼마나 정확하게 survived 생존여부를 예측할 수냐!를 활용하는 것이 관건일 것이다.

titanic.csv
0.06MB

반응형
Posted by 마르띤
,