MBA 코스 합격/대기/불합격 예측 모델
1. 소개
이 프로젝트의 목표는 주어진 데이터를 토대로, MBA 코스에 합격/대기/탈락을 예측 하는 것이다. train 데이터로 머신러닝 모델을 학습하고, 예측을 위해 데이터를 전처 리했다. 데이터셋은 학습데이터 5,000개와 테스트 데이터 1,194개이다.
2. 데이터 개요
데이터셋은 csv파일 두 개다. 학습 데이터는 5,000개 테스트 데이터는 1,194개 gender, international, gpa, major, race, gmat, work_exp, work_industry , admission 데이터는 위 특징을 가지고 있으며, 여기서 admission을 우리가 예측해야 한다. 나머 지 특징은 입력 변수로 활용했는데, 데이터는 수치형 변수와 범주형 변수로 되어있기 때문에 전처리 과정을 진행해야 한다
3. 데이터 전처리
모델 학습을 위해 깔끔한 데이터를 얻어야 한다. 따라서 데이터 전처리를 해야 한다. 각각의 파이프라인을 통해 전처리를 했다.
수치형 데이터(gpa, gmat, work_exp)에서는 SimpleImputer를 써서 각 특징의 평균 값으로 결측값을 대체했다.
범주형 데이터(gender, international, major, race, work_industry)는 빈도가 제일 높은 값으로 결측값을 대체했다. 그리고 머신러닝 모델은 수치 데이터를 쓰기 때문에 범주형 데이터를 수치형 데이터로 원-핫 인코딩으로 바꿨다.
이 전처리 과정으로 모든 데이터가 모델에 입력될 수 있도록 바뀌었다
4. 모델 빌딩
TensorFlow Keras API로 순차 신경망을 만들었다.
입력층
1번 은닉층: 뉴런 64개, ReLU 사용.
2번 은닉층: 뉴런 32개, ReLU 사용.
출력층: Softmax로 다중 분류를 했다. 클래스 수에 맞게 뉴런 수를 설정했다.
옵티마이저로 adam을 썼으며, categorical_crossentropy를 손실 함수로 썼다
5. 모델 학습
epoch 수는 최대 100으로 설정했고, overfitting을 막기 위해서 조기 종료 기능을 넣었다. Early Stopping으로 loss를 모니터링 하며, epoch가 개선 사항 없이 5번 동 안 훈련이 진행되면 종료되도록 했다.
배치 크기는 32로 설정.
전처리 완료된 train 데이터와 원-핫 인코딩된 label을 썼다.
마지막 100번째 에포크에서의 정확도는 93.94%, loss는 0.1495이다. 훈련 결과를 보아 100 에포크까지 점진적으로 정확도가 높아졌고, loss도 줄어들었 다. 이를 보면 학습이 잘 된 것으로 보인다
6. 예측 및 결과
데이터는 전처리를 한 후 모델에 입력됐다. 그리고 이에 대한 예측 결과가 만들어졌 다. 이 예측 결과는 admission에 넣어져, test_with_predictions.csv라는 최종 결과 파일을 만든다.
이번 프로젝트에서 인공 신경망 모델로 입학 여부 예측 모델을 만들었다. 100번째 에 포크에서의 정확도와 loss, 그리고 정확도와 loss가 점진적으로 높아지고 줄어든 것으 로 보아 이 모델은 데이터를 성공적으로 학습한 것으로 보인다.
결론적으로, gpa, gmat 점수가 높을수록 admit 확률이 높아진다. 특히 gpa 3.4이상 이거나 gmat이 700이상이라면, admit 확률이 높아진다. work industry가 Consulting이거나 Investment Banking일 때 합격률이 높다.
from google.colab import files
uploaded = files.upload()
uploaded = files.upload()
import pandas as pd
train_data = pd.read_csv("train_set.csv")
test_data=pd.read_csv("test_sheet.csv")
train_data.head()
test_data.head()
import pandas as pd
from sklearn.preprocessing import OneHotEncoder, StandardScaler, LabelEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.callbacks import EarlyStopping
def train_model(train_csv_path):
training_data = pd.read_csv(train_csv_path)
features = training_data.drop(['application_id', 'admission'], axis=1)
target = training_data['admission']
categorical_columns = ['gender', 'international', 'major', 'race', 'work_industry']
numerical_columns = ['gpa', 'gmat', 'work_exp']
#수치형 데이터 전처리
numeric_pipeline = Pipeline(steps=[
('imputer', SimpleImputer(strategy='mean')),
('scaler', StandardScaler())
])
#범주형 데이터 전처리
categorical_pipeline = Pipeline(steps=[
('imputer', SimpleImputer(strategy='most_frequent')),
('onehot', OneHotEncoder(handle_unknown='ignore'))
])
full_preprocessor = ColumnTransformer(
transformers=[
('num', numeric_pipeline, numerical_columns),
('cat', categorical_pipeline, categorical_columns)
])
#전처리 적용
features_prepared = full_preprocessor.fit_transform(features)
target_encoder = LabelEncoder()
target_encoded = target_encoder.fit_transform(target)
#원-핫 인코딩
n_classes = len(target_encoder.classes_)
target_categorical = to_categorical(target_encoded, n_classes)
model = Sequential()
input_size = features_prepared.shape[1]
#첫 번째 은닉층 ReLU
model.add(Dense(64, activation='relu', input_dim=input_size))
#두 번째 은닉층 ReLU
model.add(Dense(32, activation='relu'))
#출력층 Softmax
model.add(Dense(n_classes, activation='softmax'))
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
#조기 종료
early_stop_callback = EarlyStopping(monitor='loss', patience=5)
model.fit(features_prepared, target_categorical, epochs=100, batch_size=32, callbacks=[early_stop_callback])
return model, full_preprocessor, target_encoder
def predict_admission(model, full_preprocessor, target_encoder, test_csv_path, output_csv_path):
test_data = pd.read_csv(test_csv_path)
test_features = test_data.drop(['application_id', 'admission'], axis=1)
#전처리 적용
test_features_prepared = full_preprocessor.transform(test_features)
predictions_probabilities = model.predict(test_features_prepared)
predicted_classes = predictions_probabilities.argmax(axis=1)
predicted_labels = target_encoder.inverse_transform(predicted_classes)
# 예측 결과 데이터에 추가
test_data['admission'] = predicted_labels
test_data.to_csv(output_csv_path, index=False)
model, full_preprocessor, target_encoder = train_model('train_set.csv')
predict_admission(model, full_preprocessor, target_encoder, 'test_sheet.csv', 'test_with_predictions.csv')
잘못한 점.
밸리데이션 안 함 해야 함
그리고 훈련 데이터를 훈련용 테스트용으로 나눠야 하는데 그걸 안 했네