机器学习基础概念及常用算法
目录
数据类型:
标称型 vs 数值型
-
看到数据时,先判断 “数字是否仅为标签”:是→标称型;
-
若数字有实际意义且能运算→数值型,再进一步判断是离散还是连续。
离散型 vs 连续型
离散型数据:由记录不同类别个体的数目所得到的数据,又称为计数数据,所有这些数据全部都是
整数,而且不能在细分,也不能进一步提高他们的精度。
连续型数据:变量可以在某个范围内取任一数,即变量的取值可以是连续的,如长度、时间、质量
等,这类整数通常是非整数,含有小数部分。
备注: 离散型是区间不可分,连续型是区间内可分。
-
离散型:计数数据,整数,不可细分(如人数、次数)
-
连续型:可在区间内任意取值,含小数(如长度、时间、质量)
机器学习算法分类
监督学习
-
分类(目标值离散型):k - 近邻算法(KNN)、贝叶斯分类、决策树、随机森林、逻辑回归(LR)、神经网络,支持向量机,XGboost, LightGBM
-
回归(目标值连续型):线性回归、岭回归(加了正则化)(解决过拟合问题)
-
标注:隐马尔可夫模型
无监督学习
-
聚类:k-means 提取文字,通过聚类中心将数据分组
-
主成分分析 用于降纬,提取数据的主成分

二、机器学习开发流程
-
原始数据 → 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
CART决策树
回归决策树
剪枝
8.1 基本概念
决策树是一种基于树结构的分类与回归方法。它通过一系列 if-else 规则对数据进行划分,最终形成一个树形结构。
-
节点:表示一个特征或属性
-
分支:表示一个决策规则
-
叶子节点:表示一个类别(分类)或数值(回归)
8.2 决策树构建的三个步骤
-
特征选择:选择最优划分特征(如信息增益、基尼系数)
-
决策树生成:递归地构建树
-
决策树剪枝:防止过拟合(预剪枝、后剪枝)
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)
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)