简介:这份资源是传智播客黑马出品的Python机器学习基础教程压缩包,面向零基础或希望系统入门Python与机器学习的学习者,帮助其从语法基础过渡到数据分析与模型构建的实践应用。包内共1495个文件,以670个py源码、158个js脚本、135个png与39个jpg图示、102个html页面及74个pyc编译文件为主,另含xml配置、txt说明、md笔记、sql与sqlite3数据文件等,压缩包约43.39MB,目录结构清晰,便于按章节检索学习。教程内容兼顾理论讲解与代码示例,涵盖Python安装配置、基本语法结构,以及在数据分析、算法应用方面的具体实践,并配有实践项目帮助理解。目前已有224人学习下载,适合需要从基础到应用全面掌握Python编程及机器学习实践技巧的读者参考使用。
1. 从一份“Python机器学习基础教程”压缩包说起:它到底能帮你跨过哪道坎
很多人第一次接触机器学习,卡住的地方不是数学,而是环境。你拿到一份名为“Python机器学习基础教程”的资料包,解压之后大概率是一堆.ipynb、.py、.csv,外加几份 PDF。真正让人翻车的是:sklearn版本对不上、matplotlib中文乱码、pandas读 CSV 报编码错误。这份资料的价值不在于它讲了多少算法,而在于它把“从零跑通第一个模型”这条路径铺平了。它适合三类人:刚学完 Python 语法想找练手项目的学生、需要快速验证业务假设的数据分析岗、以及想从 Excel 转代码的运营。核心链路就一条:用pandas读数据,用sklearn做特征工程和建模,用matplotlib看结果。下面我按自己带新人的顺序,把这条链路拆成能直接抄的步骤。
2. 环境与数据准备:把“跑不起来”扼杀在第一步
2.1 用 conda 建一个隔离环境,别在 base 里折腾
我见过太多人因为把tensorflow和sklearn装进同一个环境导致依赖冲突,最后连import sklearn都报DLL load failed。正确做法是每个项目一个环境。假设你已装好 Miniconda,执行:
# 创建名为 ml_basic 的环境,指定 Python 3.9 # 3.9 是 sklearn 1.0+ 和 pandas 1.3+ 兼容性最稳的版本 conda create -n ml_basic python=3.9 -y # 激活环境 conda activate ml_basic # 安装核心四件套,指定版本避免自动升级到不兼容版本 pip install numpy==1.23.5 pandas==1.5.3 scikit-learn==1.2.2 matplotlib==3.7.1 # 验证安装 python -c "import sklearn; print(sklearn.__version__)"逻辑说明:numpy是底层数组库,pandas负责表格操作,scikit-learn提供算法,matplotlib画图。参数上,python=3.9是经过验证的稳定版本,scikit-learn==1.2.2包含HistGradientBoostingClassifier等常用模型且 API 稳定。如果你用pip install scikit-learn不指定版本,可能装到最新版,某些旧教程里的sklearn.cross_validation模块已被移除,会直接报ModuleNotFoundError。
提示:安装完成后用
conda list检查一遍,确认没有多个版本的 numpy 共存。
2.2 读数据前先看编码,别让UnicodeDecodeError浪费半小时
资料包里的 CSV 常见两种编码:UTF-8 和 GBK。用pandas.read_csv时如果不指定encoding,Windows 上默认用 GBK 读 UTF-8 文件就会乱码或报错。我一般先用chardet探测:
import chardet import pandas as pd # 以二进制模式读取前 10000 字节,探测编码 with open('data.csv', 'rb') as f: raw = f.read(10000) result = chardet.detect(raw) print(result) # 输出如 {'encoding': 'utf-8', 'confidence': 0.99} # 根据探测结果读取 df = pd.read_csv('data.csv', encoding=result['encoding']) print(df.head()) print(df.shape) # 查看行列数,确认没有少读列逻辑说明:chardet.detect返回置信度最高的编码。如果置信度低于 0.8,建议手动尝试utf-8和gbk。df.shape用来确认列数是否与预期一致,有时 CSV 里某列包含换行符会导致read_csv解析错位,表现为列数变多。参数上,read_csv的sep默认是逗号,如果资料里是 TSV 要改成sep='\t'。
2.3 缺失值和异常值:先看分布再决定填还是删
拿到数据别急着dropna()。我习惯先跑一遍统计:
# 查看每列缺失比例 missing_ratio = df.isnull().sum() / len(df) print(missing_ratio[missing_ratio > 0]) # 对数值列看描述统计,判断异常值 print(df.describe()) # 缺失比例低于 5% 且是数值列,用中位数填充 for col in df.select_dtypes(include=['float64', 'int64']).columns: if df[col].isnull().sum() / len(df) < 0.05: median_val = df[col].median() df[col].fillna(median_val, inplace=True) # 缺失比例高于 40% 的列直接删除 cols_to_drop = missing_ratio[missing_ratio > 0.4].index df.drop(columns=cols_to_drop, inplace=True)逻辑说明:中位数比均值抗异常值,适合收入、年龄这类偏态分布。inplace=True表示原地修改,避免赋值遗漏。如果某列缺失率在 5% 到 40% 之间,可以考虑用模型预测填充,但基础教程阶段用中位数或众数足够。注意df.select_dtypes只选数值列,类别列要用众数填充。
3. 特征工程与模型训练:把原始表格变成能预测的输入
3.1 类别特征编码:One-Hot 和 LabelEncoder 的选用边界
sklearn的模型大多不接受字符串输入。对于性别、城市这类类别特征,常见两种处理:
from sklearn.preprocessing import LabelEncoder, OneHotEncoder from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline # 方法一:LabelEncoder 用于有序类别,如“低/中/高” le = LabelEncoder() df['level_encoded'] = le.fit_transform(df['level']) # 映射关系:le.classes_ 查看,如 ['低','中','高'] -> [0,1,2] # 方法二:OneHotEncoder 用于无序类别,如“北京/上海/广州” # 用 ColumnTransformer 指定只对类别列做 One-Hot categorical_features = ['city', 'gender'] numeric_features = ['age', 'income'] preprocessor = ColumnTransformer( transformers=[ ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features), ('num', 'passthrough', numeric_features) ]) # 放入 Pipeline,避免训练集和测试集编码不一致 pipeline = Pipeline(steps=[('preprocessor', preprocessor)]) X_transformed = pipeline.fit_transform(df) print(X_transformed.shape)逻辑说明:LabelEncoder会给类别赋 0、1、2,如果类别无序,模型会误以为 2 比 0 大,所以只用于有序特征。OneHotEncoder的handle_unknown='ignore'参数保证测试集出现训练集没见过的类别时不会报错,而是输出全零向量。ColumnTransformer把不同列的处理方式组合起来,passthrough表示数值列原样保留。这一步必须在划分训练集之前用fit_transform,测试集只能用transform,否则会数据泄露。
3.2 划分训练集与测试集:random_state不是随便写的
from sklearn.model_selection import train_test_split # 假设最后一列是标签 X = df.drop(columns=['label']) y = df['label'] X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42, stratify=y ) print(X_train.shape, X_test.shape)逻辑说明:test_size=0.2表示 20% 做测试,数据量小于 1 万条时常用 0.2 到 0.3。random_state=42保证每次运行划分结果一致,方便复现。stratify=y在分类任务中按标签比例分层抽样,避免某类样本在测试集中过少导致评估指标失真。如果数据量很大(超过 10 万),可以设test_size=0.1。
3.3 训练第一个模型:从逻辑回归开始,别一上来就上 XGBoost
from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, classification_report # 用 Pipeline 把预处理和模型串起来 from sklearn.pipeline import make_pipeline model = make_pipeline( preprocessor, LogisticRegression(max_iter=1000, random_state=42) ) model.fit(X_train, y_train) y_pred = model.predict(X_test) print("准确率:", accuracy_score(y_test, y_pred)) print(classification_report(y_test, y_pred))逻辑说明:max_iter=1000是因为默认 100 次迭代在特征多时可能不收敛,会报ConvergenceWarning。classification_report输出精确率、召回率、F1,比单看准确率更能发现类别不平衡问题。逻辑回归可解释性强,系数能看出特征影响方向,适合作为基线。如果准确率明显低于 60%,先检查标签是否编码错误或特征是否包含未来信息。
4. 避坑与排查:那些教程不会写但一定会遇到的报错
4.1 坑一:fit和transform顺序颠倒导致数据泄露
现象:测试集准确率异常高,达到 99%,但上线后效果暴跌。原因:在划分训练集之前就对全量数据做了标准化或填充,测试集的统计量(均值、方差)泄露到了训练过程。解决:所有预处理必须放进Pipeline,先train_test_split,再fit训练集,transform测试集。用make_pipeline可以自动保证这个顺序。
4.2 坑二:matplotlib中文显示成方块
现象:图表标题和轴标签里的中文变成□□□。原因:matplotlib默认字体不支持中文。解决:
import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows 用黑体 plt.rcParams['axes.unicode_minus'] = False # 解决负号显示为方块如果是 macOS,把SimHei换成Arial Unicode MS。改完需要重启内核才生效。
4.3 坑三:SettingWithCopyWarning警告刷屏
现象:执行df[df['age'] > 30]['income'] = 100时报警告。原因:链式索引返回的是视图还是副本不确定。解决:用.loc一步到位:df.loc[df['age'] > 30, 'income'] = 100。如果确实想要副本,显式调用df.copy()。
4.4 坑四:类别特征 One-Hot 后维度爆炸
现象:某个城市列有 500 个取值,One-Hot 后特征从 20 维涨到 520 维,训练极慢且过拟合。原因:高基数类别特征不适合直接 One-Hot。解决:改用目标编码(Target Encoding)或频率编码,或者把稀有类别合并为“其他”。sklearn的OneHotEncoder有min_frequency参数,可以设min_frequency=10把出现少于 10 次的类别归为一类。
4.5 坑五:模型保存用pickle但加载时报版本不匹配
现象:训练好的模型用joblib.dump保存,换台机器joblib.load报AttributeError。原因:sklearn版本不一致。解决:保存时记录版本,加载环境安装相同版本。或者用onnx格式导出,跨版本兼容性更好。基础阶段建议在requirements.txt里锁死版本。
5. 从跑通到用起来:模型评估与调参的进阶手法
跑通第一个模型只是起点。真正让模型可用,需要看混淆矩阵和 ROC 曲线,而不是只看准确率。我一般用sklearn.metrics里的confusion_matrix和roc_curve:
from sklearn.metrics import confusion_matrix, roc_curve, auc import matplotlib.pyplot as plt # 混淆矩阵 cm = confusion_matrix(y_test, y_pred) print(cm) # ROC 曲线,需要预测概率而非类别 y_prob = model.predict_proba(X_test)[:, 1] fpr, tpr, thresholds = roc_curve(y_test, y_prob) roc_auc = auc(fpr, tpr) plt.figure() plt.plot(fpr, tpr, label=f'AUC = {roc_auc:.2f}') plt.plot([0, 1], [0, 1], 'k--') plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('ROC Curve') plt.legend() plt.show()逻辑说明:predict_proba返回每个类别的概率,取第二列(正类概率)。roc_curve遍历不同阈值计算假正率和真正率,auc是曲线下面积,越接近 1 越好。如果 AUC 低于 0.7,说明特征区分度不够,需要回到特征工程阶段。
调参方面,基础教程常用GridSearchCV,但数据量大时改用RandomizedSearchCV更快:
from sklearn.model_selection import RandomizedSearchCV from scipy.stats import uniform param_dist = { 'logisticregression__C': uniform(0.01, 10), 'logisticregression__penalty': ['l1', 'l2'], 'logisticregression__solver': ['liblinear', 'saga'] } # 注意:Pipeline 里模型步骤名是 logisticregression,参数要加前缀 random_search = RandomizedSearchCV( model, param_dist, n_iter=20, cv=5, scoring='roc_auc', random_state=42, n_jobs=-1 ) random_search.fit(X_train, y_train) print("最佳参数:", random_search.best_params_) print("最佳 AUC:", random_search.best_score_)参数说明:n_iter=20表示随机采样 20 组参数,cv=5是 5 折交叉验证,scoring='roc_auc'用 AUC 作为评估标准,n_jobs=-1用满所有 CPU 核心。C是正则化强度的倒数,越小正则化越强。penalty选l1时solver必须用liblinear或saga,否则报错。
最后说一个我自己的习惯:每次跑完模型,把classification_report和confusion_matrix截图存到一个文件夹,按日期命名。过一周回头看,能发现当时忽略的类别偏差。机器学习没有后悔药,但留好记录能让你下次少踩同一个坑。希望帮到你。
本文还有配套的精品资源,点击获取