简介基于Jupyter Notebook的机器学习基本模型算法教程系统讲解从数据预处理到模型调优的完整流程适合希望通过Python快速上手数据分析与建模的初学者及开发者。内容围绕NumPy、Pandas、Scikit-learn展开覆盖线性回归、逻辑回归、决策树、随机森林、支持向量机、K-Means聚类等经典算法并融入房价预测、贷款违约评估、市场细分及信用评分等实践案例便于理解算法原理与实际应用场景。压缩包共25个文件主要包含10个Markdown笔记、8个Jupyter Notebook代码及3个CSV数据集另附Python脚本和配置文件方便按步骤复现实验整体体积约2.97MB目录按算法模块划分检索清晰。目前已有2046人学习下载通过md笔记与ipynb代码结合的方式可帮助读者构建机器学习项目的基本框架掌握特征重要性分析与参数调优方法为后续深入实践打下基础。1. Jupyter Notebook 学机器学习这套案例资源到底能直接复现什么机器学习的入门路径很多但大部分人卡住的不是算法原理而是「打开一个 Notebook面对一堆代码不知道先跑哪个、每个参数改了什么、跑完怎么判断好坏」。这套基于 Jupyter Notebook 的机器学习基本模型算法教学资源好就好在它是按「数据预处理 → 线性回归 → 逻辑回归 → 决策树 → 随机森林 → SVM → 正则化 → 集成学习 → 文本向量化」的完整路线组织的每一步都落在真实数据集和可运行的 .ipynb 文件上不是拿伪代码糊弄人的讲义。我拆完整个资源包之后的感觉是它更像一套「能照着抄作业」的机器学习实验手册每个案例的代码、数据集、模型评估项都配齐了。适合两类人一类是刚装好 Jupyter Notebook 但不知道从哪下手的新手跟着顺序把每个 cell 跑一遍能把机器学习的基本流程走通另一类是有一定基础、想快速复用现成代码做课程设计或项目验证的从业者直接改数据集路径和特征列就能迁移到自己的任务上。2. 环境准备与数据预处理建模前必须做完的两件事机器学习的项目里模型训练只占一小部分时间真正耗时间的是环境折腾和数据准备。这套资源里的案例虽然代码结构清晰但如果你直接双击 .ipynb 就开跑大概率会在 import 环节或者数据加载环节卡住。先把环境基线和数据预处理这两件事理顺后面每一个 demo 才能顺畅复现。2.1 环境基线Python 内核与三个核心库的版本选择Jupyter Notebook 本身只是一个交互式壳子真正干活的解释器是它背后的 Python 内核。我习惯的做法是用 Miniconda 建一个独立环境给机器学习用不污染系统 Python也不跟其他项目的包互相打架。装好之后在终端里执行jupyter notebook浏览器弹出管理界面再打开资源包里的 .ipynb 文件这时候 Notebook 会连到当前 conda 环境的 Python 内核上。# 创建独立环境Python 版本控制在 3.93.11 之间 # scikit-learn 1.2 对旧版 Python 已经停止支持3.8 会提示版本过旧 conda create -n ml_learning python3.10 -y conda activate ml_learning # 安装核心库一次装齐 pip install jupyter numpy pandas scikit-learn matplotlib gensim参数说明Python 3.10 是目前兼容性最稳的版本numpy 和 pandas 的预编译轮子都齐全不用本地编译。scikit-learn是这套资源的绝对主角线性回归、逻辑回归、决策树、随机森林、SVM 全部来自它版本建议 1.2 以上接口更规范。gensim是给 Word2Vec 案例用的资源包里那个word2vec.ipynb依赖它。装完环境之后重新打开 Jupyter Notebook右上角内核显示Python 3 (ipykernel)再跑代码就不会看到ModuleNotFoundError。这套资源里的案例代码多数是教学向的没有用到特别新的语法所以版本不用追求最新。反而是版本太新会踩坑比如新版本 scikit-learn 里某些参数名做了调整旧代码跑起来会报警告。我的原则是「跑通优先」装好一套稳定版本之后就不要频繁升级了。2.2 用 Pandas 读 CSV清洗、类型转换与特征标准化资源包里带了DecisionTree.csv和kaggle_credict.ipynb用到的信用评分数据这类表格数据的第一步永远是read_csv但这里有一个新手最容易踩的细节Pandas 读入数据后会自动生成一列Unnamed: 0索引列如果不处理它会被当成一个特征喂给模型。import pandas as pd # 方式一明确指定第一列是索引列csv 里带了行号 df pd.read_csv(DecisionTree.csv, index_col0) # 方式二先用 head 看结构再决定怎么处理 df_preview pd.read_csv(DecisionTree.csv) print(df_preview.head()) print(df_preview.info()) print(df_preview.isnull().sum())逻辑说明index_col0是告诉 Pandas「文件里的第一列是行索引不是业务特征」。很多课程数据在导出时都会带一列序号不指定的话它会混进X特征矩阵导致模型多出一个无意义维度。info()用来查看每一列的数据类型和缺失值情况isnull().sum()统计每列缺失数量。拿到真实数据后我一般先跑这三行确认列名、类型、缺失情况之后才动手建模。数据清洗完之后还有一个关键步骤是标准化。决策树和随机森林对特征尺度不敏感但线性回归、逻辑回归、SVM 对特征数值范围非常敏感尤其是像cnews_demo这种文本分类场景特征矩阵的数值跨度可能非常大。from sklearn.preprocessing import StandardScaler # 先分离特征和标签 X df.drop(columns[label]).values y df[label].values # 标准化让每个特征都变成均值为0、方差为1的分布 scaler StandardScaler() X_scaled scaler.fit_transform(X)逻辑说明fit_transform在训练集上计算均值和标准差然后用这套参数完成转换。注意这里必须只用训练集fit测试集只做transform不能拿全量数据去fit否则会造成信息泄漏——测试集的信息提前混进了预处理参数里评估结果会虚高。这一点在资源包的回归和分类案例里反复出现是机器学习流程里最常见的隐含错误之一。数据预处理没有固定模板但清洗缺失值、去掉多余的索引列、数值型特征做标准化这三步是表格类数据建模前的固定动作。这套资源里的每个案例都默认你做好了这些前置工作直接跑建模的 cell 才能得到课件里展示的指标。3. 线性回归、逻辑回归与正则化从系数预测到分类决策边界这一章是整套资源里代码密度最高的部分。线性回归负责「预测连续数值」逻辑回归负责「预测二分类概率」正则化则是在两种回归模型的基础上解决过拟合问题。三个案例放在一起学能完整看到「建模 → 评估 → 调优」的完整链路。3.1 线性回归房价预测与系数解读线性回归的核心假设是目标值y与特征X之间存在线性关系。资源里的 Linear Regression demo 用的是最经典的房价预测场景特征是房屋面积和卧室数量这类连续或离散变量。建模代码本身非常简单难的是理解模型的输出和验证结果是否可靠。import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score # 假设 df 已有面积、卧室数、房价三列 X df[[area, bedrooms]].values y df[price].values X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42 ) model LinearRegression() model.fit(X_train, y_train) y_pred model.predict(X_test) # 评估RMSE 越小越好R2 越接近1越好 rmse mean_squared_error(y_test, y_pred, squaredFalse) r2 r2_score(y_test, y_pred) print(fRMSE: {rmse:.2f}) print(fR2: {r2:.2f}) print(系数:, model.coef_, 截距:, model.intercept_)逻辑说明train_test_split中test_size0.2表示预留 20% 数据做最终验证random_state42固定随机种子保证每次运行划分结果一致这是可复现的关键。mean_squared_error默认返回 MSE加squaredFalse得到 RMSE单位与原始目标值一致更好解释。R2衡量模型解释了多少比例的目标方差0.8 以上算不错的基线模型。参数说明特征列用.values转成 numpy 数组而不是直接传 DataFrame 列。这是一个小但有用的习惯——Pandas DataFrame 在 sklearn 旧版本里会触发DataConversionWarning直接用 numpy 数组能避免这类警告干扰注意力。如果特征不止一列LinearRegression会自动做多元回归不需要额外处理。跑完线性回归后我最关心的两个数是系数和 RMSE。系数告诉你「面积每增加 1 平米房价平均涨多少」这是线性模型独有的可解释性优势。如果 RMSE 远大于房价均值说明线性假设不成立常见做法是换随机森林这类非线性模型继续尝试而不是在同一个模型上调参。3.2 逻辑回归从回归跨界到分类逻辑回归虽然名字带「回归」实际是分类算法。它的输出是「样本属于正类的概率」默认以 0.5 作为分界阈值。资源里的 Logistic Regression demo 用的场景是用户购买预测这属于典型的二分类问题。逻辑回归的代码骨架跟线性回归非常相似但多了标准化的前置步骤和惩罚项设置。from sklearn.linear_model import LogisticRegression from sklearn.preprocessing import StandardScaler from sklearn.metrics import classification_report, roc_auc_score # 特征标准化逻辑回归的损失函数对特征尺度敏感 scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test) # C 是正则化强度的倒数数值越小正则化越强 clf LogisticRegression(C1.0, max_iter1000, random_state42) clf.fit(X_train_scaled, y_train) y_pred clf.predict(X_test_scaled) y_prob clf.predict_proba(X_test_scaled)[:, 1] print(classification_report(y_test, y_pred)) print(AUC:, roc_auc_score(y_test, y_prob))逻辑说明C1.0是默认值表示正则化强度适中。max_iter1000是逻辑回归最常踩的坑——sklearn 默认只有 100 次迭代特征多或数据量大时经常不收敛直接改 1000 能规避绝大部分ConvergenceWarning。predict_proba返回每个类别的概率取第二列得到正类概率计算 AUC 时需要它不能用 predict 的硬标签。参数说明classification_report会输出精确率、召回率、F1 值。这三个指标在分类任务里比准确率更有参考价值尤其是正负样本不均衡时准确率会被多数类带偏F1 才是真实水平。线性回归和逻辑回归都适用正则化对应资源包里的RidgeCV.ipynb和LassoCV.ipynb。两者的区别是Ridge 用 L2 惩罚系数被均匀压缩但不会变成零Lasso 用 L1 惩罚能把不重要的特征系数压到零起到特征选择作用。CV后缀代表它内置交叉验证自动选参不需要手动试 alpha。from sklearn.linear_model import RidgeCV, LassoCV # alpha 候选范围设置成对数等距覆盖多个数量级 alphas np.logspace(-3, 3, 20) ridge RidgeCV(alphasalphas, cv5) ridge.fit(X_train_scaled, y_train) print(Ridge 最优 alpha:, ridge.alpha_) lasso LassoCV(alphasalphas, cv5, max_iter10000) lasso.fit(X_train_scaled, y_train) print(Lasso 最优 alpha:, lasso.alpha_) print(Lasso 零系数个数:, sum(lasso.coef_ 0))逻辑说明cv5表示五折交叉验证把训练集分成五份轮流用四份训练一份验证最终选出平均误差最小的 alpha。交叉验证比单次train_test_split更稳定因为它不依赖某一次随机划分的运气。LassoCV跑完后看coef_里有多少个零这是它做特征选择的最直观证据。这套资源把线性和逻辑回归放在目录前面是有道理的——它们是理解后面所有复杂模型的基石。系数怎么读、分类指标怎么选、正则化参数怎么调这三个问题弄明白之后学决策树和随机森林会顺畅很多。4. 决策树、随机森林、SVM 与 Word2Vec从表格到文本的模型路线这一章是资源包的进阶部分。决策树解决「模型可解释性」随机森林解决「单棵树不够稳」SVM 解决「高维数据分类」Word2Vec 解决「文本怎么变成向量」。四个案例组合在一起覆盖了从结构化表格数据到非结构化文本数据的完整建模路径。4.1 决策树的可解释性与超参数陷阱决策树模型用一套 if-else 规则把样本一层层划分开。它的魅力在于训练完可以直接把树画出来看到每次划分用了哪个特征、阈值是多少。资源包里那个DecisionTree.csv配对的DecisionTree.ipynb完整演示了「训练 → 画树 → 读特征重要性」的流程这也让它成了对比机器学习跟「玄学」的最佳教材。from sklearn.tree import DecisionTreeClassifier, plot_tree import matplotlib.pyplot as plt # 训练一棵深度受限的决策树 dt DecisionTreeClassifier(max_depth4, min_samples_split10, random_state42) dt.fit(X_train, y_train) # 树的可视化直接画出划分逻辑 plt.figure(figsize(16, 10)) plot_tree(dt, filledTrue, feature_names[area, bedrooms], class_names[0, 1]) plt.show() # 特征重要性哪个特征贡献最大 importance pd.Series(dt.feature_importances_, index[area, bedrooms]).sort_values() importance.plot(kindbarh)参数说明max_depth4限制树的深度防止无限分裂导致过拟合。min_samples_split10规定内部节点至少要有 10 个样本才继续划分这两个参数是决策树防过拟合的核心开关。如果不设置它们决策树会一直划分到每个叶子都是纯类别训练集准确率接近 100%测试集一塌糊涂这是新手最常犯的错误。使用逻辑说明plot_tree画出的树里每个节点会显示「划分特征、阈值、样本数、类别分布、基尼系数」。读树的时候优先看根节点的第一个划分特征——它是模型认为区分能力最强的变量。feature_importances_是决策树对每个特征重要性的量化取值范围 0 到 1加起来等于 1数值越大表示该特征在划分中被用得越多。4.2 随机森林与模型集成用投票机制抵消单棵树的不稳定随机森林的出发点很朴素单棵决策树可能学过拟合那训练几十上百棵树最后取平均或投票噪音就被抵消了。资源包里的RandomForestRegression.ipynb和kaggle_credict.ipynb分别展示了回归场景和信用评分竞赛场景下的集成方法。后者是 Kaggle 经典入门赛题的复现版核心套路是「多模型融合 交叉验证评估」。from sklearn.ensemble import RandomForestClassifier from sklearn.ensemble import VotingClassifier from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC # 随机森林200棵树每棵深度限制为8 rf RandomForestClassifier(n_estimators200, max_depth8, random_state42) rf.fit(X_train, y_train) print(RandomForest Accuracy:, rf.score(X_test, y_test)) # 模型集成逻辑回归 随机森林 SVM 投票 voting VotingClassifier( estimators[ (lr, LogisticRegression(max_iter1000)), (rf, RandomForestClassifier(n_estimators100, max_depth8)), (svm, SVC(probabilityTrue, random_state42)) ], votingsoft ) voting.fit(X_train_scaled, y_train) print(Voting Accuracy:, voting.score(X_test_scaled, y_test))逻辑说明n_estimators200越大单个模型之间的随机性被平均得越干净但训练时间线性增长200 是一个性价比不错的值。max_depth8给每棵树限高让树之间保持差异性——如果每棵树都长到全深所有树学到的模式完全相同投票就退化成单棵树。votingsoft表示软投票按每个模型输出的概率取平均votinghard是硬投票直接按每个模型的最终类别标签投票。软投票一般表现更好因为它保留了置信度信息。Kaggle 信用评分类任务的实际套路我一般在资源包基础之上叠加这三步先跑一个最简单的逻辑回归当基线再上随机森林看提升幅度最后用 VotingClassifier 融合三个差异大的模型。集成学习的收益来自「好而不同」——每个模型性能不能太差但它们的犯错模式要尽量不相关。信用评分场景里还需要特别注意类别不均衡问题。如果正例违约用户只占 5%模型全预测负例也有 95% 准确率但这种模型毫无价值。常见做法是在class_weightbalanced参数下重新训练或者用StratifiedKFold保证交叉验证的每一折里正负比例一致。4.3 SVM 与 Word2Vec核函数升维与文本向量化SVM 的原理概括成一句话就是「在高维空间找一个最大间隔的超平面来分割数据」。它的核心参数是核函数。资源包里的 SVM 目录下搭了一个cnews_demo文本分类示例新闻文本天然是高维稀疏数据很适合展示 SVM 的威力。但 SVM 对特征尺度极其敏感文本 TF-IDF 向量化后如果直接丢给SVC容易收敛得慢或者分类边界偏移。from sklearn.svm import SVC from sklearn.feature_extraction.text import TfidfVectorizer # 文本向量化用 TF-IDF 把新闻转成数值矩阵 tfidf TfidfVectorizer(max_features5000, stop_wordsenglish) X_text_vec tfidf.fit_transform(cnews_texts) # RBF 核是最常用的默认选择处理非线性边界 svm SVC(kernelrbf, C1.0, gammascale, probabilityTrue, random_state42) svm.fit(X_text_vec, y_text)参数说明kernelrbf是径向基核函数能处理非线性分类边界也是绝大多数场景的首选。C1.0是误分类惩罚调大则模型更倾向拟合训练集调小则更重视泛化。gammascale让算法根据特征数量自动计算核函数宽度比手动指定gamma0.1更省心这也是新版本推荐的做法。probabilityTrue允许 SVM 输出概率代价是训练耗时增加但如果后面要接 VotingClassifier 做集成概率输出是必须的。SVM 的训练复杂度是样本数的平方到立方级别超过 1 万条数据后训练会非常慢文本分类场景下我一般先用 TF-IDF 把特征压缩到 5000 维以内既能控制维度爆炸又能保留重要词汇信息。文本处理的另一条路线是 Word2Vec资源包里对应word2vec.ipynb。Word2Vec 和 TF-IDF 的差别是TF-IDF 输出一个稀疏的「词是否出现」向量语义相近但写法不同的词完全无法关联Word2Vec 训练后能用一个稠密向量表示每个词并且「国王 - 男人 女人 ≈ 女王」这类语义操作真正可用。from gensim.models import Word2Vec # 输入是句子列表每条句子是已经分好词的列表 sentences [ [机器学习, 模型, 训练], [数据, 清洗, 特征, 工程], [模型, 评估, 交叉验证] ] # 训练一个 128 维的词向量模型 w2v Word2Vec( sentences, vector_size128, window5, min_count1, epochs20, sg0 # sg0 用 CBOWsg1 用 Skip-gram ) # 查看语义相似词 similar_words w2v.wv.most_similar(模型, topn5) print(similar_words)参数说明vector_size128是词向量维度维度越高能捕捉的语义信息越丰富但训练时间和内存开销也越大128 是中等规模语料的常用起点。window5表示上下文窗口只看当前词前后 5 个词窗口越大越能捕捉长距离依赖。min_count1表示出现次数少于 1 次的词直接忽略语料小的时候设 1 保证所有词都有向量。sg0用 CBOW 算法训练速度快且对高频词友好如果语料足够大sg1的 Skip-gram 对低频词效果更好。Word2Vec 训练完之后要把词向量合并成语义向量常见做法是「词向量求平均」把一条文本里所有词的向量加总取平均得到一个固定长度的向量表示再做分类。这套流程在标题分类、情感分析这类任务里非常实用是 SVM 之外的另一种文本建模思路。5. 避坑与排查五个高频翻车记录与定位思路这一章是从这套资源包和真实项目经验里沉淀下来的踩坑记录。每一个都是实际跑代码时会遇到的问题按照「现象 → 原因 → 解决」写方便对照排查。5.1 数据侧的坑索引列混入、数据类型错位与标准化遗漏第一个高频问题训练完模型后发现特征矩阵里多了一列全是 0、1、2、3 这样的顺序数字。原因是read_csv时没指定索引列Pandas 自动把文件自带的行号读成了Unnamed: 0列。解决方法是加载时加index_col0或者在建模前用df.drop(columns[Unnamed: 0], inplaceTrue)手动删掉。这个坑在资源包的DecisionTree.csv里尤其典型因为这份 CSV 第一列正好就是行号。第二个问题特征列看着是数字但df.info()显示类型是object。往往是 CSV 里混入了NA、null或者空字符串Pandas 直接整列读成字符串。表现是StandardScaler报错或fit时报could not convert string to float。解决方法是读入后先把缺失值统一成np.nan再pd.to_numeric()强制转换最后用中位数或均值填充。第三个问题是标准化只对训练集做了fit_transform测试集也用fit_transform而不是transform。表现是测试集评估指标比想象中好但部署后表现明显下滑。原因是测试集的信息被混入预处理参数属于数据泄漏。解决方法是严格分离训练集和测试集训练集fit_transform测试集只transform。5.2 模型侧的坑不收敛、过拟合与版本不兼容逻辑回归和 SVM 最常见的问题是警告ConvergenceWarning。现象是训练结束后模型准确率很低警告提示迭代次数不够。原因是max_iter100是 sklearn 的默认值特征维度上来之后梯度下降走不完。解决方法是把max_iter调到 1000同时配合特征标准化能解决 80% 的收敛问题。如果调大后仍然不收敛再检查是不是有离散特征被直接塞进了模型而没有做独热编码。决策树和随机森林的坑集中在过拟合上。现象是训练集准确率接近 100%测试集准确率差一截。原因是树深度没有限制模型把训练集的噪声当成规律学了下来。解决方法是给决策树加max_depth和min_samples_split随机森林加max_depth并把n_estimators提高到 100 以上。这类问题在资源包的RandomForestRegression.ipynb里有过体现推荐在跑完模型后先比较训练集和测试集的分数差差距大于 5 个点就要考虑收紧限制条件。Word2Vec 的坑在版本兼容性上。老教程里写的是Word2Vec(sentences, size128)但 gensim 4.0 之后size参数改成了vector_size。直接跑老代码会报TypeError: __init__() got an unexpected keyword argument size。解决方法是确认自己的 gensim 版本4.0 以上统一用vector_size。这类因版本升级导致的 API 变更非常隐蔽代码逻辑没有任何问题纯粹是名称变了。排查的顺序一般是先看报错信息里的关键词是参数名不识别还是函数不存在再去查对应版本文档最后对照搜索结果改代码。6. 进阶验证技巧交叉验证与可复现的 Notebook 交付规范资源包最后的Model Ensemble和Regularization两个模块里都用到了交叉验证但把它们当成独立工具掌握收益会大得多。交叉验证的核心价值是「用有限数据做多次验证」比单次train_test_split的评估结果更可信。尤其是数据集比较小的时候单次划分的随机性可能导致评估结果大幅波动同一套代码换一个random_state分数能差 5 个百分点以上。from sklearn.model_selection import cross_val_score, StratifiedKFold from sklearn.ensemble import RandomForestClassifier # 五折分层交叉验证每折的正负样本比例与整体一致 cv StratifiedKFold(n_splits5, shuffleTrue, random_state42) scores cross_val_score( RandomForestClassifier(n_estimators100, max_depth8, random_state42), X_train_scaled, y_train, cvcv, scoringf1 ) print(每折 F1:, scores) print(平均 F1: {:.3f} ± {:.3f}.format(scores.mean(), scores.std()))逻辑说明StratifiedKFold比普通KFold多一步保持每折类别比例一致处理不均衡数据集时必须用它。scoringf1指定用 F1 作为评估指标比 accuracy 更能反映分类真实水平。输出的分数均值是模型能力的估计标准差则是稳定性估计——标准差超过 0.05 说明模型对数据划分方式敏感需要回头检查数据质量或模型复杂度。模型评估用哪类指标我一般按这张表来选任务场景首选指标原因普通二分类正负样本均衡accuracy简单直接容易解释正负样本不均衡F1 / AUC防止多数类带偏评估欺诈检测 / 罕见病筛查Recall漏判代价高于误判信用评分AUC不依赖阈值选择排序能力更强回归任务RMSE / MAE单位与目标值一致交叉验证之后最后一个环节是把训练好的模型保存下来这是很多人会忽略的步骤。训练模型消耗了时间和算力直接丢掉的话下次复现又要重新跑一遍数据变了结果也就不一样了。我这里习惯用 joblib 保存加载之后直接调用中间不经过序列化转换对 sklearn 模型兼容性最好。import joblib # 保存模型和标准化参数到本地 joblib.dump(reg_model, model/reg_model.pkl) joblib.dump(scaler, model/scaler.pkl) # 新数据进来时先加载再预测 loaded_model joblib.load(model/reg_model.pkl) loaded_scaler joblib.load(model/scaler.pkl) X_new_scaled loaded_scaler.transform(X_new) pred loaded_model.predict(X_new_scaled)从那以后我每次做机器学习项目都强制自己走一遍这套流程交叉验证评估模型稳定性、joblib 固化模型和预处理器、Notebook 里记录随机种子和库版本。这套习惯从第一个课程设计用到现在的实际项目帮我在「测试集上分数很好、上线后表现崩盘」这类问题上省了太多回头路。建模不是 Jupyter Notebook 里跑通代码就算完可复现、可保存、可验证才是工程闭环。希望帮到你。本文还有配套的精品资源点击获取