2019년 머신러닝 강의를 따라가며 작성한 파이썬 / scikit-learn 학습 예제 모음입니다. 각 스크립트는 한 가지 개념만 다루며, 코드보다 한글 주석이 본문입니다. 위에서 아래로 읽으면 설명 → 코드 → 출력 순으로 이어집니다.
- 예제 스크립트 144개 (
1_basic28 +2_scikit-learn110 + 곁가지 6), 실습 데이터 9종 (data/) - 2019년 코드를 2026년 최신 라이브러리에서 동작하도록 갱신 (아래 2026 현대화 참고)
pip install -r requirements.txt스크립트는 반드시 자기 디렉터리에서 실행합니다. 데이터 경로가 ../../data/… 형태의 상대 경로이기 때문입니다.
cd 2_scikit-learn/1_knn && python KNeighborsClassifier_01.pymatplotlib 창이 뜨는 예제는 창을 닫아야 다음 코드가 실행됩니다. 창 없이 실행하려면 MPLBACKEND=Agg 를 붙이세요.
| 라이브러리 | 검증 버전 |
|---|---|
| Python | 3.12 |
| scikit-learn | 1.9 |
| pandas | 3.0 |
| numpy | 2.5 |
| matplotlib | 3.11 |
| 디렉터리 | 예제 | 내용 |
|---|---|---|
1_numpy |
12 | 배열 생성·인덱싱·슬라이싱·연산·브로드캐스팅 |
2_pandas |
16 | Series/DataFrame, 조회·정렬·그룹핑·결측치, boston 실습 |
| 디렉터리 | 예제 | 내용 |
|---|---|---|
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처리되어 저장소에 커밋되지 않습니다.
| 파일 | 용도 |
|---|---|
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 스팸 — 텍스트 분류 |
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/GridSearchCV 의 n_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사용을 권합니다.
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 에 따른 변화도 동일했습니다.
⚠️ LinearSVC의penalty는 폐기 대상이 아닙니다. 경고도 발생하지 않으므로2_LinearSVC/예제 3개는 그대로 둡니다. 같은 이름이지만 다른 클래스의 매개변수입니다.
8_searching_hyper_parameters/7_GridSearchCV_EX.py 는 solver 조건부 그리드를 배우는 예제인데, liblinear 가 다중분류를 더 이상 지원하지 않습니다. iris 는 3클래스라 liblinear 후보 12개(전체 18개 중)가 전부 학습에 실패하고 있었습니다.
GridSearchCV 가 실패 후보를 NaN 점수로 처리하는 탓에 스크립트는 정상 종료해서 겉으로는 멀쩡해 보였지만, 실제로는 탐색 공간의 2/3 가 죽은 채였습니다. liblinear → saga 로 교체해 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종.