目录

数据类型:

标称型 vs 数值型

离散型 vs 连续型

机器学习算法分类

监督学习

无监督学习

二、机器学习开发流程

三、Scikit-learn 数据集与估计器

3.1 数据集划分

3.2 常用数据集

3.3 转化器

3.4 估计器(Estimator)

四、K-近邻算法(KNN)

4.1 算法原理

4.2 优缺点

4.3 代码示例

KNN算法引入

利用KNN解决飞书案例

五、朴素贝叶斯算法

完整贝叶斯公式为:

公式简化的原因

不简化分母

结合场景的朴素假设​编辑

拉普拉斯平滑系数​编辑

模型案例

六、模型评估

1. 混淆矩阵

2. 评估指标

七、模型的选择和调优

1. k-折交叉验证

意义?

2. 超参数搜索-网格搜索

八、决策树

ID3决策树

C4.5模型

API

CART决策树​编辑

回归决策树

剪枝

8.1 基本概念

8.2 决策树构建的三个步骤

8.3 常用划分准则

8.4 信息增益与基尼系数

8.5 Scikit-learn 中的决策树API

8.6 决策树优缺点

优点:

 缺点:

8.7 随机森林(Random Forest)

8.8 代码示例:鸢尾花分类(决策树)

九、逻辑回归

9.1 基本概念

9.2 Sigmoid函数

9.3 损失函数(对数似然损失)

9.4 实现代码


数据类型:

标称型 vs 数值型

  • 看到数据时,先判断 “数字是否仅为标签”:是→标称型;

  • 若数字有实际意义且能运算→数值型,再进一步判断是离散还是连续。

离散型 vs 连续型

离散型数据:由记录不同类别个体的数目所得到的数据,又称为计数数据,所有这些数据全部都是

整数,而且不能在细分,也不能进一步提高他们的精度。

连续型数据:变量可以在某个范围内取任一数,即变量的取值可以是连续的,如长度、时间、质量

等,这类整数通常是非整数,含有小数部分。

备注: 离散型是区间不可分,连续型是区间内可分。

  • 离散型:计数数据,整数,不可细分(如人数、次数)

  • 连续型:可在区间内任意取值,含小数(如长度、时间、质量)

机器学习算法分类

监督学习

  • 分类(目标值离散型):k - 近邻算法(KNN)、贝叶斯分类、决策树、随机森林、逻辑回归(LR)、神经网络,支持向量机,XGboost, LightGBM

  • 回归(目标值连续型):线性回归、岭回归(加了正则化)(解决过拟合问题)

  • 标注:隐马尔可夫模型

无监督学习

  • 聚类:k-means 提取文字,通过聚类中心将数据分组

  • 主成分分析 用于降纬,提取数据的主成分

二、机器学习开发流程

  1. 原始数据 → 2. 数据特征工程 → 3. 算法学习 → 4. 模型 → 5. 模型评估 → 6. 模型选择 → 7. 模型应用

三、Scikit-learn 数据集与估计器

3.1 数据集划分

from sklearn.model_selection import train_test_split X_train,
 X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

3.2 常用数据集

  • load_iris():鸢尾花数据集,3类,4特征,150样本

  • load_digits():手写数字数据集,10类,64特征,1797样本

  • fetch_20newsgroups():新闻文本数据集,20类,18000样本

  • load_boston():波士顿房价数据集,回归问题,13特征,506样本

3.3 转化器

"""
    fit() 步骤:
        计算数据的统计信息(如均值、标准差、最大值,最小值等) 无论你调用归一化还是标准化,
        这些需要的数都已经被算出来了
        这些统计信息会被保存在 scaler 对象中
    transform() 步骤:
        使用 fit() 得到的统计信息对数据进行转换
        调用对应的实例化对象的公式进行转化
    fit_transform() 步骤:
        先执行 fit() 计算统计信息,再执行 transform() 完成转换
        是 fit() + transform() 的便捷写法
"""
result = scaler.fit_transform(data)

3.4 估计器(Estimator)

  • 分类估计器:KNeighborsClassifier, LogisticRegression, NaiveBayes

  • 回归估计器:LinearRegression, Ridge

估计器就是模型对象

四、K-近邻算法(KNN)

4.1 算法原理

  • 通过测量不同特征值之间的距离进行分类。

  • 选择k个最近邻居中出现次数最多的类别作为预测结果。

4.2 优缺点

  • 优点:精度高、对异常值不敏感、无数据输入假定

  • 缺点:计算复杂度高、空间复杂度高

4.3 代码示例

KNN算法引入

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# KNN算法
from sklearn.neighbors import KNeighborsClassifier


# 数据集的划分
def knn_deal():
    # 加载数据集
    iris = load_iris()
    x = iris.data  # 特征值
    y = iris.target  # 目标值
    # X_train(训练集的特征值)  X_test(测试集的特征值)
    # y_train(训练集的目标值)  y_test (测试集的目标值)
    # 将数据集进行划分
    X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)

    #实例化    n_neighbors=5就是文档中案例knn中的k值
    knn = KNeighborsClassifier(n_neighbors=5)
    knn.fit(X_train, y_train)

    # 模型评估
    print("模型的准确率:", knn.score(X_test, y_test))
    # 预测
    print("预测结果:", knn.predict(X_test))
if __name__ == '__main__':
    knn_deal()

利用KNN解决飞书案例

from sklearn.model_selection import train_test_split
# KNN算法
from sklearn.neighbors import KNeighborsClassifier
import pandas as pd
# 标准化 归一化
from sklearn.preprocessing import StandardScaler

# 加载数据的特征集
df = pd.read_csv("./train.csv")[:-1]

print(df)

# 数据量太大 训练太慢 减少
data = df
print(data)

# 把特征字段time换成扩增 年月日季度等
# 特征字段扩增
time_value = pd.to_datetime(data["time"], unit='s')
time_value = pd.DatetimeIndex(time_value)
# print(time_value)
data["day"] = time_value.day
data["hour"] = time_value.hour
data["weekday"] = time_value.weekday

# 扩充完后删除原始字段time
data.drop(labels=["time"], axis=1, inplace=True)
# 删除删除无用的字段
data.drop(labels=["row_id"], axis=1, inplace=True)
print(data)
# 数据集的x和y
x = data.drop(labels=["place_id"], axis=1) # 特征值
y = data["place_id"]  # 目标值

# 训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.25)

# 标准化
std = StandardScaler()
X_train_std = std.fit_transform(X_train)
X_test_std = std.fit_transform(X_test)
print(y_train)

#实例化    n_neighbors=5就是文档中案例knn中的k值
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)

# 模型评估
print("模型的准确率:", knn.score(X_test, y_test))
# 预测
print("预测结果:", knn.predict(X_test))

五、朴素贝叶斯算法

完整贝叶斯公式为:

  • 各部分含义:

公式简化的原因

所以你看到的公式,是省略了分母的 “propto(正比于)” 简化版,核心逻辑是:

后验概率 ≈ 似然度(词在类别里的概率) × 先验概率(类别本身概率)

不简化分母

结合场景的朴素假设

这一步把多词的联合概率拆成 “各词独立概率的乘积”,大幅简化计算(尽管现实中词可能有依赖,但假设独立能落地 )。

例题

拉普拉斯平滑系数

模型案例

from sklearn.datasets import fetch_20newsgroups  # 新闻分类数据集导入
from sklearn.feature_extraction.text import TfidfVectorizer  # 特征值化
from sklearn.model_selection import train_test_split  # 数据集分割
from sklearn.naive_bayes import MultinomialNB  # 贝叶斯

def beiyesi():
    print(1111)
    # 数据集
    news = fetch_20newsgroups()

    # 数据集的划分
    x_train,x_test,y_train,y_test = train_test_split(news.data, news.target, test_size=0.3)

    print(x_train)
    # 特征值化
    tf = TfidfVectorizer()
    # 训练集  不能对测试集进行fit_transform 因为 训练集和测试集不能同时进行特征值化
    x_train = tf.fit_transform(x_train)
    x_test = tf.transform(x_test)

    # 贝叶斯
    mlt = MultinomialNB(alpha=1.0)

    # 训练
    mlt.fit(x_train, y_train)
    # 预测
    print(mlt.score(x_test, y_test))
    print(mlt.predict(x_test))

if __name__ == '__main__':
    beiyesi()

六、模型评估

1. 混淆矩阵

真实 \ 预测
正例
反例
正例
TP
FN
反例
FP
TN

2. 评估指标

  • 精确率(Precision):TPTP+FPTP+FPTP​

  • 召回率(Recall):TPTP+FNTP+FNTP​

  • F1-Score:2⋅Precision⋅RecallPrecision+RecallPrecision+Recall2⋅Precision⋅Recall​

        精确率(Precision):“查得准不准” —— 在你所有预测为正的例子中,有多少是预测对了的。 召回率(Recall):“查得全不全” —— 在所有真实为正的例子中,你成功找出了多少。

        在很多模型中,精确率和召回率是相互矛盾的。提高一个通常会导致另一个降低。 如果你想提高召回率(找出所有病人),你就需要放宽预测标准,这会导致更多健康人被误判(FP增加),从而降低精确率。 如果你想提高精确率(确保预测的每个病人都是对的),你就需要收紧预测标准,这会导致一些真正的病人被漏掉(FN增加),从而降低召回率。 因此,选择优化哪个指标,完全取决于你的业务需求和应用场景。而 F1-Score 则是这两个指标的调和平均数,用于综合评估模型的性能。


from sklearn.datasets import fetch_20newsgroups  # 新闻分类数据集
from sklearn.model_selection import train_test_split  # 数据集分割
from sklearn.preprocessing import StandardScaler  # 标准化
from sklearn.naive_bayes import MultinomialNB  # 贝叶斯
from sklearn.feature_extraction.text import TfidfVectorizer  # 特征值化
# 评估
from sklearn.metrics import classification_report
# 交叉验证
from sklearn.model_selection import cross_val_score

def beiyesi():
    print(1111)
    news = fetch_20newsgroups()

    x_train,x_test,y_train,y_test = train_test_split(news.data, news.target, test_size=0.3)

    # print(x_train)
    # 特征值化
    tf = TfidfVectorizer()
    # 转化器 训练集
    x_train = tf.fit_transform(x_train)
    x_test = tf.transform(x_test)

    # 朴素贝叶斯
    mlt = MultinomialNB(alpha=1.0)

    # 交叉验证
    print(cross_val_score(mlt,x_train,y_train,cv=5))
    # mlt.fit(x_train, y_train)
    # # 准确率
    # print(mlt.score(x_test, y_test))
    # print(mlt.predict(x_test))
    # print("这下边是模型评估")
    # res = classification_report(y_test,mlt.predict(x_test),target_names=news.target_names)
    # print("模型的正确率和召回率:",res)




if __name__ == '__main__':
    beiyesi()

七、模型的选择和调优

1. k-折交叉验证

意义?

从有限的学习数据中获取尽可能多的有效信息;

可以在一定程度上避免过拟合问题。

from sklearn.model_selection import cross_val_score scores = cross_val_score(model, X, y, cv=5)

2. 超参数搜索-网格搜索

通常情况下,有很多参数是需要手动指定的(如k-近邻算法中的K值),这种叫超参数。但是手动过程繁杂,

所以需要对模型预设几种超参数组合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型。

from sklearn.model_selection import GridSearchCV
params = {"n_neighbors": [1, 3, 5, 7]}
grid = GridSearchCV(knn, param_grid=params, cv=5)
grid.fit(X_train, y_train)
print(grid.best_params_)

八、决策树

ID3决策树

C4.5模型

信息增益率

API

讲这么多都是为了API里面的接口

CART决策树

回归决策树

剪枝

8.1 基本概念

决策树是一种基于树结构的分类与回归方法。它通过一系列 if-else 规则对数据进行划分,最终形成一个树形结构。

  • 节点:表示一个特征或属性

  • 分支:表示一个决策规则

  • 叶子节点:表示一个类别(分类)或数值(回归)


8.2 决策树构建的三个步骤

  1. 特征选择:选择最优划分特征(如信息增益、基尼系数)

  2. 决策树生成:递归地构建树

  3. 决策树剪枝:防止过拟合(预剪枝、后剪枝)

8.3 常用划分准则

算法
划分准则
特点
ID3
信息增益
倾向于选择取值多的特征
C4.5
信息增益比
克服ID3偏向多值特征的问题
CART
基尼系数(分类)
平方误差(回归)
可用于分类和回归

8.4 信息增益与基尼系数

8.5 Scikit-learn 中的决策树API

8.6 决策树优缺点

优点:
  • 易于理解和解释
  • 不需要特征缩放
  • 可以处理数值型和分类型数据
  • 能处理多输出问题
 缺点:
  • 容易过拟合(需剪枝)
  • 对数据敏感,小变化可能导致树结构大变
  • 忽略特征间的相关性

8.7 随机森林(Random Forest)

随机森林是多个决策树的集成方法,通过投票或平均提高准确率和鲁棒性。
from sklearn.ensemble import RandomForestClassifier 
rf = RandomForestClassifier( n_estimators=100, # 树的数量 
max_depth=5, random_state=42 ) 
rf.fit(X_train, y_train) print(rf.score(X_test, y_test))

8.8 代码示例:鸢尾花分类(决策树)

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.model_selection import train_test_split
import pydotplus

# 加载数据
iris = load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 训练决策树
clf = DecisionTreeClassifier(max_depth=3, random_state=42)
clf.fit(X_train, y_train)

# 评估
print("Accuracy:", clf.score(X_test, y_test))

# 可视化(可选)
dot_data = export_graphviz(
    clf, 
    out_file=None,
    feature_names=iris.feature_names,
    class_names=iris.target_names,
    filled=True
)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_png("iris_tree.png")

九、逻辑回归

9.1 基本概念

  • 用于二分类问题(广告点击率、用户性别判断等)

  • 输出为概率值(通过sigmoid函数转换)

9.2 Sigmoid函数

9.3 损失函数(对数似然损失)

9.4 实现代码

from sklearn.linear_model import LogisticRegression

log_reg = LogisticRegression(penalty='l2', C=1.0)
log_reg.fit(X_train, y_train)
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐