안녕하세요. 다니엘입니다.
예비 유학생은 주로 유튜브나 블로그 또는 관련 홈페이지를 통해 정보를 얻습니다. 이후 여러 유학원을 방문, 추가 상담을 받으며 유학 갈 학교를 선택 하는데요… 최종 결정까지 많은 시간과 비용이 소요되기도 하고 유학원마다 추천 학교가 달라 고민에 빠지기도 합니다.
AI를 활용해 나에게 맞는 유학 프로그램을 추천 받으면 좋겠다는 생각을 했던 저는 아래와 같이 가설을 세워봅니다.
예비 유학생은 원하는 유학 국가, 희망 전공을 입력한다
자신의 학력, 학업 성적, 어학 성적을 입력한다.
위 정보로 입학 가능성을 판별하고 해당 대학을 추천 해 준다
1. ChatGPT - 추천 알고리즘
해외 대학 입학 가능성을 판별, 추천을 해야 하기에 해당 알고리즘을 챗GPT에게 물어봅니다.
(중략)
2. ChatGPT - 머신러닝으로 입학 가능성 예측 & 샘플 코드
챗GPT가 알려준 머신러닝 기법(결정 트리(Decision Tree), 랜덤 포레스트(Random Forest), 선형 회귀(Linear Regression), K-최근접 이웃(K-Nearest Neighbors), 서포트 벡터 머신(SVM) )이 어렵게 느껴집니다. 자세히 예측 방법을 알려달라고 요청합니다.
(중략)
챗GPT가 알려준 파이썬 코드를 직접 실행 해 봅니다.
3. ChatGPT - 오류 분석 및 수정
알려준 랜덤 포레스트 모델 코드를 그대로 실행 해 보니 오류가 발생합니다. 익숙한 장면(?)이기에 오류 분석과 함께 수 정한 코드를 부탁합니다.
오류 분석 요청 (4~5번 요청 함)
오류#1
위 오류는 Python 스크립트에서 scikit-learn 라이브러리를 찾지 못해서 발생한 것입니다. ModuleNotFoundError는 해당 라이브러리가 설치되어 있지 않거나, Python 환경에서 인식되지 않는 경우에 발생합니다. 이를 해결하기 위해 scikit-learn을 설치해야 합니다.
오류#2
오류 메시지 NameError: name 'X_train' is not defined는 X_train 변수가 정의되지 않은 상태에서 사용하려고 했기 때문에 발생합니다. 이는 데이터가 준비되지 않은 상태에서 StandardScaler를 사용하려고 할 때 발생하는 일반적인 문제입니다.
오류#3
pandas 모듈이 설치되지 않아 발생하는 오류입니다. pandas를 설치하려면 pip 명령어를 사용하면 됩니다. 아래 단계를 따라 설치하고 실행해 보세요.
오류#4
cross_val_score 함수에서 발생한 오류는 교차 검증의 n_splits 값이 데이터 샘플 수보다 클 때 발생합니다. 현재 데이터셋에서 X_train의 샘플 수가 4개이므로, cv 값을 5로 설정하면 오류가 발생합니다. 따라서 cv 값을 데이터 샘플 수 이하로 설정해야 합니다.
데이터 샘플 수가 적을 때는 교차 검증에서 사용되는 cv 값을 줄이거나, train_test_split의 test_size 비율을 조정하여 충분한 샘플이 확보되도록 할 수 있습니다.
여기서는 cv 값을 3으로 줄여서 문제를 해결할 수 있습니다. 코드를 수정하여 다시 실행해 보겠습니다.
우여곡절 끝에 오류 없는 코드를 받았습니다. ^^
import pandas as pd
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report
# 샘플 데이터 생성
data = {
'country': ['미국', '캐나다', '호주', '영국', '뉴질랜드'],
'degree': ['학사', '석사', 'MBA', '학사', '석사'],
'education_level': ['고등학교 졸업', '전문대 졸업', '고등학교 졸업', '전문대 졸업', '고등학교 졸업'],
'high_school_gpa': [3.5, 3.0, 4.0, 3.2, 3.8],
'college_gpa': [3.6, 2.9, 3.9, 3.0, 3.7],
'major': ['경영학', '공학', '디자인', '법', '사이언스'],
'english_test': ['IELTS', 'TOEFL', 'PTE', '시험점수 없음', 'IELTS'],
'english_score': [7.0, 95, 70, 0, 7.5],
'age': [18, 21, 22, 19, 20],
'gender': ['female', 'male', 'female', 'male', 'female'],
'region': ['seoul', 'busan', 'incheon', 'daegu', 'gwangju'],
'admitted': [1, 0, 1, 0, 1] # 1: admitted, 0: not admitted
}
df = pd.DataFrame(data)
# 데이터 전처리
numeric_features = ['high_school_gpa', 'college_gpa', 'english_score', 'age']
numeric_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='mean')),
('scaler', StandardScaler())
])
categorical_features = ['country', 'degree', 'education_level', 'major', 'english_test', 'gender', 'region']
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
('onehot', OneHotEncoder(handle_unknown='ignore'))
])
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)
])
X = df.drop('admitted', axis=1)
y = df['admitted']
# 전처리 파이프라인 적용
X_preprocessed = preprocessor.fit_transform(X)
# 모델 선택 및 학습
X_train, X_test, y_train, y_test = train_test_split(X_preprocessed, y, test_size=0.2, random_state=42)
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)
# 모델 평가 및 튜닝
param_grid = {
'n_estimators': [100, 200, 300],
'max_depth': [None, 10, 20, 30],
'min_samples_split': [2, 5, 10]
}
grid_search = GridSearchCV(model, param_grid, cv=2, scoring='accuracy')
grid_search.fit(X_train, y_train)
print("Best parameters:", grid_search.best_params_)
model = grid_search.best_estimator_
# 학위와 희망 전공에 따른 가중치 적용 함수
def apply_weights(degree, major):
weight = 1.0
if degree == 'MBA':
weight += 0.2
elif degree == '석사':
weight += 0.1
if major in ['경영학', '공학']:
weight += 0.1
elif major in ['디자인', '법']:
weight -= 0.1
return weight
# 사용자로부터 학생 데이터 입력 받기
def get_student_data():
country = input("유학 국가 (미국, 캐나다, 호주, 영국, 뉴질랜드): ")
degree = input("학위 (학사, 석사, MBA): ")
education_level = input("최종 학력 (고등학교 졸업, 전문대 졸업): ")
high_school_gpa = float(input("고등학교 GPA: "))
college_gpa = float(input("대학교 GPA: "))
major = input("희망 전공 (경영학, 공학, 디자인, 법, 사이언스, 마케팅, 건축): ")
english_test = input("영어 성적 유무 (IELTS, TOEFL, PTE, 시험점수 없음): ")
english_score = 0
if english_test != '시험점수 없음':
english_score = float(input(f"{english_test} 점수: "))
age = int(input("나이: "))
gender = input("성별 (male/female): ")
region = input("출신 지역: ")
student_data = pd.DataFrame({
'country': [country],
'degree': [degree],
'education_level': [education_level],
'high_school_gpa': [high_school_gpa],
'college_gpa': [college_gpa],
'major': [major],
'english_test': [english_test],
'english_score': [english_score],
'age': [age],
'gender': [gender],
'region': [region]
})
return student_data
# 학생 데이터 입력 받기
new_student = get_student_data()
# 데이터 전처리
new_student_preprocessed = preprocessor.transform(new_student)
# 입학 가능성 예측
admission_probability = model.predict_proba(new_student_preprocessed)
weight = apply_weights(new_student['degree'][0], new_student['major'][0])
weighted_admission_probability = admission_probability[0][1] * weight
print("Admission Probability:", admission_probability)
threshold = 0.5
if weighted_admission_probability >= threshold:
print("입학 가능성이 높습니다.")
else:
print("입학 가능성이 낮습니다.")
print(f"입학 가능성 점수: {weighted_admission_probability * 100:.2f}%")
# 약점 보완 가이드라인 제공
if new_student['english_score'].values[0] < 6.5 and new_student['english_test'].values[0] == 'IELTS':
print("영어 점수를 높이세요.")
if new_student['high_school_gpa'].values[0] < 3.0:
print("고등학교 성적이 높아야 합니다.")
4. VSCode - 파이썬 실행 결과
Admission Probability: [[0.22 0.78]]
입학 가능성이 높습니다.
입학 가능성 점수: 93.60%
5. ChatGPT - 웹 구현을 위한 준비
웹을 통한 서비스가 목적이기에 챗GPT에게 필요한 단계를 물어봅니다.
(중략)
6. Mapify - 웹사이트 메뉴 정리
벨라님이 알려주신 마인드맵 툴 Mapify를 활용해 유학 추천 서비스(Future Bridge) 메뉴 구성을 정리 해 보았습니다.
6. 느낀점
아이디어를 구체화하기 위해 ChatGPT에게 많은 질문을 했고 이를 통해 추천 알고리즘과 필요한 기능과 데이터 종류, 그리고 구현 방법에 대한 기본적인 로드맵을 얻었습니다.
챗GPT로 얻은 정보와 아이디어를 Mapify 마인드맵으로 작성해 보니, 전체적인 웹 구조를 쉽게 이해할 수 있었습니다.
아직 해외 대학 입학 정보 DB 구축, 학교/학과별 가중치 부여등 보완해야 할 부분이 많기에 지속적인 수정 및 업데이트가 필요합니다.
7. 질문
위 기능을 웹으로 구현하기 위한 자세한 로드맵이 궁금합니다. 조언 부탁 드려요! : )
인스타그램 계정 생성 했습니다. ^^
#11기스타트업