[데이터셋]
https://www.kaggle.com/datasets/jsphyg/weather-dataset-rattle-package?select=weatherAUS.csv
categorical = [col for col in x_train.columns if x_train[col].dtypes == 'O']
numerical = [col for col in x_train.columns if x_train[col].dtypes != 'O']
print(categorical)
print("")
print(numerical)
x_train[numerical] = x_train[numerical].fillna(x_train[numerical].mean())
x_test[numerical] = x_test[numerical].fillna(x_train[numerical].mean())
for df in [x_train, x_test]:
df['WindGustDir'].fillna(x_train['WindGustDir'].mode()[0], inplace=True)
df['WindDir9am'].fillna(x_train['WindDir9am'].mode()[0], inplace=True)
df['WindDir3pm'].fillna(x_train['WindDir3pm'].mode()[0], inplace=True)
df['RainToday'].fillna(x_train['RainToday'].mode()[0], inplace=True)
y_train.fillna(y_train.mode()[0], inplace=True)
y_test.fillna(y_test.mode()[0], inplace=True)
Before | After |
---|---|
이상치 확인 |
---|
from sklearn.preprocessing import LabelEncoder
label_encoder = LabelEncoder()
x_train['RainToday'] = label_encoder.fit_transform(x_train['RainToday'])
x_test['RainToday'] = label_encoder.transform(x_test['RainToday'])
y_train = label_encoder.fit_transform(y_train)
y_test = label_encoder.fit_transform(y_test)
import pandas as pd
categorical_variables = ['Location', 'WindGustDir', 'WindDir9am', 'WindDir3pm']
for var in categorical_variables:
dummies = pd.get_dummies(x_train[var], prefix=var)
x_train = pd.concat([x_train, dummies], axis=1)
x_train.drop(var, axis=1, inplace=True)
for var in categorical_variables:
dummies = pd.get_dummies(x_test[var], prefix=var)
x_test = pd.concat([x_test, dummies], axis=1)
x_test.drop(var, axis=1, inplace=True)
date_columns = ['Date']
def process_date_columns(data):
data['Date'] = pd.to_datetime(data['Date'])
data['Year'] = data['Date'].dt.year
data['Month'] = data['Date'].dt.month
data['Day'] = data['Date'].dt.day
data.drop(date_columns, axis=1, inplace=True)
return data
x_train = process_date_columns(x_train)
x_test = process_date_columns(x_test)
import statsmodels.api as sm
x_constant_train = sm.add_constant(x_train)
model = sm.Logit(y_train,x_constant_train)
result = model.fit()
회귀분석 결과 요약표
로지스틱 회귀 모델의 결과를 통해, 예측 성능은 Pseudo R-squared가 0.33으로 중간 수준이며, 주어진 데이터에 대한 적합도는 높은 편입니다. 로그우도 값은 -40874로, 상수항만으로 이루어진 기본 모델보다 훨씬 더 높은 예측 성능을 보여주고 있습니다. 이로써 모델이 데이터를 더 잘 설명하고 있음을 확인할 수 있습니다.
from sklearn.metrics import accuracy_score
x_constant_test = sm.add_constant(x_test)
threshold = 0.5
y_train_pred = result.predict(x_constant_train) > threshold
y_test_pred = result.predict(x_constant_test) > threshold
from sklearn.metrics import confusion_matrix
import seaborn as sns
matrix = confusion_matrix(y_test,y_test_pred)
sns.heatmap(
matrix,
annot = True,
fmt="d"
)
Before | After |
---|---|
++
가장 영향을 주는 변수는 뭐가 있을까?
대체적으로 바람이 북쪽으로 많이 불때 비가 오는 경향이 있고
Mount Ginini ,Wollongong ,Townsville지역은 비가 적게온다고 예측할 수 있다. 또한 오후 3시에 기압이 높을경우, 햇빛이 강할경우도 비가 적게오는 요소라고 볼 수 있다.
전처리 과정에서 너무 많은 변수를 가지다 보니 과적합 상태가 일어난 것 같다.
그러므로 유의미한 변수를 내버려 두고 필요한 변수만 내버려 두어서 과적합을 방지하는 것이 좋을것 같다고 생각한다. 또한 더 많은 도메인 지식이 있었다면, Date 변수를 통해 시계열분석을 하는 등,월별 강수량을 통하여 새로운 컬럼을 만드는 식으로도 봤어도 괜찮았을 것같다.
하지만 임계값을 조정하면서 재현율등을 올리는 결과를 도출하기도 했다.