Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

26 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

machineLearningStudy

2019년 머신러닝 강의를 따라가며 작성한 파이썬 / scikit-learn 학습 예제 모음입니다. 각 스크립트는 한 가지 개념만 다루며, 코드보다 한글 주석이 본문입니다. 위에서 아래로 읽으면 설명 → 코드 → 출력 순으로 이어집니다.

  • 예제 스크립트 144개 (1_basic 28 + 2_scikit-learn 110 + 곁가지 6), 실습 데이터 9종 (data/)
  • 2019년 코드를 2026년 최신 라이브러리에서 동작하도록 갱신 (아래 2026 현대화 참고)

실행 방법

pip install -r requirements.txt

스크립트는 반드시 자기 디렉터리에서 실행합니다. 데이터 경로가 ../../data/… 형태의 상대 경로이기 때문입니다.

cd 2_scikit-learn/1_knn && python KNeighborsClassifier_01.py

matplotlib 창이 뜨는 예제는 창을 닫아야 다음 코드가 실행됩니다. 창 없이 실행하려면 MPLBACKEND=Agg 를 붙이세요.

확인된 실행 환경

라이브러리 검증 버전
Python 3.12
scikit-learn 1.9
pandas 3.0
numpy 2.5
matplotlib 3.11

커리큘럼

1_basic — 파이썬 데이터 처리 기초

디렉터리 예제 내용
1_numpy 12 배열 생성·인덱싱·슬라이싱·연산·브로드캐스팅
2_pandas 16 Series/DataFrame, 조회·정렬·그룹핑·결측치, boston 실습

2_scikit-learn — 머신러닝

디렉터리 예제 내용
0_data_load_split 1 데이터 로딩과 학습/테스트 분할
1_knn 11 K-최근접 이웃 (분류 / 회귀), 스케일 민감성
2_linear_model 32 선형회귀 · Ridge · Lasso / 로지스틱회귀 · LinearSVC
3_decision_tree 7 의사결정나무, 가지치기, 트리 시각화
4_ensemble 9 Voting · Bagging · RandomForest · GradientBoosting
5_svm 4 SVM 의 gamma · C · 스케일링 영향
6_preprocessing 7 결측치 처리, 스케일러, 인코딩
7_cross_validation 5 KFold · StratifiedKFold · cross_val_score
8_searching_hyper_parameters 8 GridSearchCV 로 하이퍼파라미터 탐색
9_text_preprocessing 9 CountVectorizer · TF-IDF, 스팸 필터
10_pipeline 9 Pipeline 으로 전처리+학습 묶기, 교차검증 누수 방지
11_save_restore 6 pickle · joblib 모델 저장/복원

11_save_restore번호 순서대로 실행해야 합니다. 홀수 번(저장)이 모델 파일을 만들고 짝수 번(복원)이 그 파일을 읽습니다. 생성물은 .gitignore 처리되어 저장소에 커밋되지 않습니다.

실습 데이터 (data/)

파일 용도
boston.csv 보스턴 집값 — 회귀 (8개 예제)
extended_boston.csv 보스턴 확장판(104특성) — 과적합/규제 실습
diabetes.csv 당뇨 진행도 — 회귀 (9개 예제)
iris.csv 붓꽃 — 다중분류
winequality-red.csv / winequality-white.csv 와인 품질 — 분류 (11개 예제)
score.csv 성적 — 기초 실습
SMSSpamCollection / sms.csv SMS 스팸 — 텍스트 분류

2026 현대화

2019년에 작성된 코드라 최신 라이브러리에서 다수가 실행되지 않았습니다. 전체 예제를 최신 스택에서 실행해 실패를 실측한 뒤, 깨진 부분만 고쳤습니다. 변경한 자리에는 모두 # [2026 수정] 주석으로 이유를 남겼으므로, 원래 배운 내용과 무엇이 달라졌는지 코드에서 바로 확인할 수 있습니다.

라이브러리 변경 대응

변경 영향 대응
sklearn.datasets.load_boston 제거 (sklearn 1.2) 6개 원본 데이터를 data/boston.csv 로 보관해 동일 실습 유지
LogisticRegression(multi_class=…) 제거 (sklearn 1.7) 5개 multinomial 은 기본값이므로 삭제, ovr 은 OneVsRestClassifier 로 대체
BaggingClassifier(base_estimator=…)estimator= (sklearn 1.4) 3개 매개변수명 변경 (param_grid 키 포함)
GridSearchCV(iid=…) 제거 (sklearn 1.0) 2개 매개변수 삭제
LogisticRegression(n_jobs=…) 무효화 (sklearn 1.8, 1.10 제거 예정) 5개 매개변수 삭제 — 병렬화는 상위 cross_val_score/GridSearchCVn_jobs 가 담당
LogisticRegression(penalty=…) 폐기 (sklearn 1.8, 1.10 제거 예정) 3개 l1_ratio 로 교체 ('l2'0, 'l1'1) — 아래 참고
liblinear 다중분류 미지원 1개 saga 로 교체 — 아래 참고
np.NaN 제거 (numpy 2.0) 1개 np.nan 으로 변경

load_boston 에 대한 참고 — scikit-learn 은 이 데이터셋의 B 특성이 인종 비율을 가공한 값이라는 윤리적 문제로 1.2 버전에서 삭제했습니다. 여기서는 2019년 강의 내용을 그대로 보존하기 위해 원본(CMU StatLib)을 CSV 로 두었습니다. 새로 회귀 실습을 만든다면 fetch_california_housing 사용을 권합니다.

정규화 매개변수 penalty → l1_ratio

LogisticRegression(penalty=…) 은 sklearn 1.8 에서 deprecated 되어 1.10 에서 제거됩니다. 대체는 l1_ratio 이며 'l2'0, 'l1'1 로 대응합니다.

penalty 자체가 학습 주제인 예제(L1/L2 비교, 그리드 탐색 대상)라, 바꾼 결과가 원래와 같은 것을 먼저 확인한 뒤 교체했습니다 — 같은 solver 에서 계수 차이는 수렴 허용오차 수준(tol=1e-8 에서 5e-7, saga 에서는 완전 일치)이고, L1 이 계수를 0 으로 보내는 정도와 C 에 따른 변화도 동일했습니다.

⚠️ LinearSVCpenalty 는 폐기 대상이 아닙니다. 경고도 발생하지 않으므로 2_LinearSVC/ 예제 3개는 그대로 둡니다. 같은 이름이지만 다른 클래스의 매개변수입니다.

liblinear 후보가 통째로 죽어 있던 문제

8_searching_hyper_parameters/7_GridSearchCV_EX.pysolver 조건부 그리드를 배우는 예제인데, liblinear 가 다중분류를 더 이상 지원하지 않습니다. iris 는 3클래스라 liblinear 후보 12개(전체 18개 중)가 전부 학습에 실패하고 있었습니다.

GridSearchCV 가 실패 후보를 NaN 점수로 처리하는 탓에 스크립트는 정상 종료해서 겉으로는 멀쩡해 보였지만, 실제로는 탐색 공간의 2/3 가 죽은 채였습니다. liblinearsaga 로 교체해 18개 후보 전부 정상 학습되도록 했습니다.

조건부 그리드라는 학습 목적은 그대로입니다 — lbfgs 는 여전히 l1_ratio=1 을 거부하고, saga 만 L1·L2·elasticnet 을 모두 지원합니다. 아울러 기본 max_iter=100 으로는 수렴 전에 멈춰 경고가 49건 발생하고 점수도 수렴 한계에 걸리므로, 저장소의 다른 예제와 동일하게 max_iter=10000 을 지정했습니다(경고 0건).

기존 버그 수정

  • 1_numpy/numpy_09.py — 브로드캐스팅 실패를 보여주는 예제가 실제로 스크립트를 중단시켜 뒤쪽 2차원 예제가 실행되지 않았습니다. try/except 로 감싸 에러를 출력하면서 계속 진행하도록 수정.
  • 4_ensemble/3_RandomForest/…Classifier_EX.py — 다른 예제(유방암)에서 복사되며 남은 cancer 변수 때문에 NameError 로 중단됐습니다. 이 예제의 데이터(wine)로 교체.

정리한 중복·산출물

같은 내용을 오타 이름으로 두 번 커밋한 디렉터리가 여럿 있었습니다. 각 쌍의 커밋 이력과 내용을 비교해 나중에 정리된 쪽만 남겼습니다 (삭제되는 쪽의 설명 주석이 남는 쪽에도 있는지 확인한 뒤 삭제).

삭제 남김 판단 근거
1_knm/ 1_knn/ knn 이 이후 커밋까지 이어짐, 파일·주석 모두 더 많음
2_Classification/1_LogistaticRegression/ 1_LogisticRegression/ 오타 쪽은 파일 1개, 정상 쪽은 8개
4_ensemble/5_SVM/ 5_svm/ SVM 은 앙상블 기법이 아니며, 5_svm 이 오타·설명이 교정된 확장판
…RandomForestClassifiter*.py …RandomForestClassifier*.py 오타 쪽 주석에 한글 오타 다수
1_basic/numpy_01.py 1_basic/1_numpy/numpy_01.py 완전 동일 파일
gui/icon.jpeg, outlmailtest/data/company_list.xlsx 각 원본 완전 동일 파일

그 외:

  • .spyproject/, .ipynb_checkpoints/ — 에디터 산출물, 삭제 후 .gitignore 등록
  • save_model_using_pickle.bin — 2019년에 저장된 모델 파일로, 최신 sklearn 에서는 로딩 자체가 불가(ModuleNotFoundError: sklearn.ensemble.gradient_boosting). 삭제하고 저장 예제로 재생성하도록 변경
  • documents & files/documents/ (경로에 공백·& 가 있어 셸에서 다루기 어려움)
  • 9_text_preprocessiong/9_text_preprocessing/ (오타)

실행 시간이 매우 긴 예제

n_estimators 가 크게 잡힌 예제들은 최신 환경에서도 오래 걸립니다. 버그가 아니라 원래 파라미터이므로 값은 그대로 두었습니다. 빠르게 확인만 하려면 n_estimators 를 100 정도로 낮추세요.

예제 파라미터 실측 (8코어 기준)
9_text_preprocessing/8_…Spam_Filter_GridSearch.py 36조합 × 5폴드 × 최대 3000트리 40분 내 미완료
7_cross_validation/3_cross_validation.py GB n_estimators=10000 × 5폴드 40분 내 미완료
10_pipeline/7_pipeline_EX.py GridSearchCV 8×8 (SVC 배깅) 40분 내 미완료
5_svm/4_SVM_EX.py SVC 배깅 n_estimators=10000 15분 내 미완료
8_searching_hyper_parameters/4_GridSearchCV_EX.py GridSearchCV 15분 내 미완료
8_searching_hyper_parameters/5_GridSearchCV_EX.py GridSearchCV 15분 내 미완료
4_ensemble/2_Bagging/ensemble_02_BaggingClassifier.py n_estimators=100000 매우 김
7_cross_validation/5_cross_validation.py n_estimators=10000 약 9분
4_ensemble/3_RandomForest/…Classifier_EX.py n_estimators=10000 약 7분
4_ensemble/4_GradientBoosting/…Classifier_EX.py n_estimators=10000 약 6분
10_pipeline/6_pipeline_EX.py GridSearchCV 8×8 약 4분
8_searching_hyper_parameters/4_GridSearchCV.py GridSearchCV 약 2분

이 예제들은 n_jobs=-1 을 중첩해 쓰기 때문에 여러 개를 동시에 돌리면 워커가 죽습니다. 하나씩 실행하세요.


머신러닝과 무관한 디렉터리

학습 중 곁가지로 실험한 코드로, 위 커리큘럼과 관계가 없습니다. 별도 의존성이 필요합니다.

  • gui/ — PyQt5 창 띄우기 실습. pip install PyQt5 easygui 필요. 01.window.py 는 커밋되지 않은 신청기업.xlsx 를 읽으므로 실행되지 않습니다.
  • outlmailtest/ — Outlook 자동 메일 발송. pywin32 가 필요한 Windows 전용 코드입니다.
  • documents/ — 강의 배포 PDF 2종.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages