python零基础16:机器学习
一、机器学习基础
机器学习是关于从数据中提取知识的,是通过从已知示例中泛化来自动化决策过程的算法。
分类:有监督的机器学习; 无监督的机器学习
- 有监督的机器学习:有输入-输出关系来训练系统
- 无监督的机器学习:根据输入数据的内在特征自动组织和学习
数据表示:瘦高数据;矮胖数据 - 瘦高数据:特征数量较少,但样本数量较多。统计学的重点。
- 矮胖数据:特征数量较多,但样本数量较少。机器学习的重点。
有监督学习
任务类型:回归和分类
- 回归:是预测连续数值的目标变量;
- 分类:预测离散类别的目标变量。
模型拟合
泛化(generalization):一个好的模型必须在未见过的新数据上表现出好的预测能力。
欠拟合(underfitting):模型在训练数据上表现不好。
过拟合(overfitting):模型在训练数据上表现很好,但在新数据上表现差。
机器学习python
机器学习工具包:sklearn (scikit-learn)
- 所有模型都遵循fit()、predict()、score() 等统一的接口(不同机器学习方法都用这几个函数用,这个意义就是多态)
- 丰富的算法支持
- 底层基于Cython加速
在终端:
pip intstall sklearn
如果报错的话:
note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed to build 'sklearn' when getting requirements to build wheel
解决办法:
# 1. 先升级 pip
python -m pip install --upgrade pip
# 2. 安装 scikit-learn(推荐用清华镜像)
pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple
安装数据集
pip install mglearn
玩具数据集
import mglearn
import sklearn
import matplotlib.pyplot as plt
X,y=mglearn.datasets.make_wave(n_samples=40)
plt.plot(X,y,'o')
plt.xlim(-3.3)
plt.xlabel("Feature")
plt.ylabel("Target")
真实数据集
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
print("cancer.keys():\n{}".format(cancer.keys))
二、有监督学习
机器学习方法简述:
- K-NN K近邻
- 通过计算新样本与训练集中样本的距离,找到最近的k个邻居,根据这些邻居的标签进行投票,从而预测新样本的类别。
from sklearn.model_selection import train_test_split
X,y = mglearn.datasets.make_forge()
X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=0)
from sklearn.neighbors import KNeighborsClassifier
clf = KNeighborsClassifier(n_neighbors=3)
clf.fit(X_train,y_train)
print("Test set predictions:{}".format(clf.predict(X_test)))
print("Test set accuracy:{:.2f}".format(clf.score(X_test,y_test)))
逻辑回归

逻辑回归通过Sigmoid函数,将线性组合的连续值z
映射到(0, 1)区间内,这个映射后的值可以被解释为
因变量为某一类的概率。

逻辑回归算法名称:LogisticRegression
支持向量机 (support vector machine)
支持向量机(SVM)通过寻找一个最优超平面来最大化不同类别数据点之间的间隔。这个超平面由支持向量(即距离决策平面最近的几个关键数据点)确定,目标是使模型具有更好的泛化能力。


https://ompramod.medium.com/support-vector-machine-svm-68bf201b4aa2
Python 示例代码: 代表SVM的是:LinearSVC
import mglearn
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC # 改为 LinearSVC,这是分类器而不是回归器
import numpy as np
# 创建数据
X, y = mglearn.datasets.make_forge()
fig, axes = plt.subplots(1, 2, figsize=(10, 3))
# 使用 LinearSVC 替代 LinearSVR
for model, ax in zip([LinearSVC(), LogisticRegression()], axes):
clf = model.fit(X, y)
mglearn.plots.plot_2d_separator(clf, X, fill=False, eps=0.5,
ax=ax, alpha=.7)
mglearn.discrete_scatter(X[:, 0], X[:, 1], y, ax=ax)
ax.set_title("{}".format(clf.__class__.__name__))
ax.set_xlabel("Feature 0")
ax.set_ylabel("Feature 1")
axes[0].legend()
plt.tight_layout()
plt.show()
交叉验证
交叉验证通过将数据集分成多个小部分,反复训练和测试模型,以获得更可靠的性能估计。
最常见的是k折交叉验证,数据被分成k个子集,每次用k-1个子集训练模型,剩下的1个子集用于测试,重复k次后取平均值。k通常为5或10。
# cross validation
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
iris = load_iris()
logreg = LogisticRegression()
# easy version
scores = cross_val_score(logreg,iris.data,iris.target,cv=5)
print("cross-validation scores:{}".format(scores))
print("average cross-validation score:{:.2f}".format(scores.mean()))
# 官方给的标准的KFold方法
from sklearn.model_selection import KFold
kfold = KFold(n_splits = 5)
scores = cross_val_score(logreg,iris.data,iris.target,cv=kfold)
# 所得的scores是一个列表 所以可以直接做mean 方法就是scores.mean()
print("cross-validation score:{:.2f}".format(scores.mean()))
三、无监督学习
- 无监督变换:将数据从高维特征空间转换为低维表示,提取关键特征,使数据更易于人类或机器学习算法理解。
无监督学习方法:
- 聚类:将数据划分为若干个相似的簇,每个簇包含相似的数据点。
数据预处理一个步骤:数据缩放,优点:加速模型训练和提高模型性能
缩放分类:最小-最大缩放和标准化
- StandardScaler:将特征转换为均值为0、标准差为1的分布。
- MinMaxScaler:将特征范围将数据缩放到指定范围0到1。
- Normalizer:对每个样本进行归一化处理。
注意:数据缩放是模型训练的一部分,只能用训练集来构建缩放器,然后分别缩放数据集X_train和测试集X_test
https://scikit-learn.org/stable/modules/preprocessing.html
四、多环节集成:构建机器学习pipeline
- 机器学习的多环节:
- 预处理
- 特征提取
- 模型训练
- 模型测试等
- pipeline 优势:形成一个单一的scikit-learn估计器,简化代码,提高可读性。
- Pipeline输入参数是一个列表,其元素是由字符串和估计器组成的元组。
Pipeline 的基本结构
Pipeline 的输入参数是一个列表,列表中的每个元素是一个元组。
# 创建步骤1
step1 = ('scaler', StandardScaler())
# 创建步骤2
step2 = ('classifier', LogisticRegression())
# 组合成 Pipeline
pipeline = Pipeline([step1, step2])
# 等价于
pipeline = Pipeline([
('scaler', StandardScaler()),
('classifier', LogisticRegression())
])
每个元组包含两个部分:
- 字符串:步骤的名称(可以自定义)
- 估计器:一个 scikit-learn 转换器或模型对象
# ('步骤名称', 估计器对象)
('scaler', StandardScaler())
# 字符串'scaler' + StandardScaler()对象
例子:
# Pipelines
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
import mglearn
from sklearn.model_selection import train_test_split
X,y = mglearn.datasets.make_forge()
X_train, X_test, y_train, y_test = train_test_split(X,y,random_state=0)
pipe = Pipeline([("scaler",MinMaxScaler()),("svm",SVC())])
pipe.fit(X_train,y_train)
print("Test score:{:.2f}".format(pipe.score(X_test,y_test)))
components = pipe.named_steps["svm"]
列表用[idx]索引:

Pipeline 特点
- Pipeline对象具有fit、predict和score方法,其行为与scikit-learn 中的任何其他模型完全相同。
- 通过管道的named_steps属性访问管道中各个步骤的参数。
零零碎碎的笔记
列表
axes 轴域元组
交叉验证:主要目的是估算性能
通过交叉验证,得到0.9的正确率
最后交给用户的时候能够确保所有数据都作为训练集,能够达到0.9(因为这里用的是所有数据,肯定成绩会更好)
分成测试集和训练集
scaler不能放测试集
无监督学习
transform 替代
超参数调整?sklearn 也提供了很简单的接口来使用
pipe对象 named_steps是一个属性 ”swm“是
numpy 开发包
pipeline
开发 用spyder
真正做机器学习 用 jupyter 面向交互式分析
更多推荐

所有评论(0)