无监督学习:
https://scikit-learn.org

Preprocessing

Dimensionality reduction

Model selection

Classification

Regression

Clustering

scikit-learn的传统线性回归(最小二乘法):
linear_model.LinearRegression
以一个简单的房屋价格预测作为例子来解释线性回归的基本要素。
目标是预测一栋房子的售出价格(元)。
这个价格取决于很多因素,如房屋状况、地段、市场行情等。
为了简单起见,假设价格只取决于房屋状况的两个因素,即面积(平方米)和房龄(年)。
接下来我们希望探索价格与这两个因素的具体关系。
设房屋的面积为
其中
其中
目标变量(因变量):
特征变量(自变量):特征,
预测模型:
残差项(误差项):
假设残差项
使用最小二乘法找到系数
为了找到系数的解析解,我们可以对
首先,对
对
对
矩阵形式:需要将关于
其中:
确定一个
对
得到:
由于
此时
Logistic回归(Logistic Regression,简称LR)是一种常用的处理二类分类问题的模型。在二类分类问题中,把因变量y可能属于的两个类分别称为负类和正类,则因变量y∈{0, 1},其中0表示负类,1表示正类。

逻辑回归作为分类线性模型实现的,而不是按照 scikit-learn/ML 命名法的回归模型。逻辑回归在文献中也称为 logit 回归、最大熵分类 (MaxEnt) 或对数线性分类器。
在此模型中,使用逻辑函数
预测值:
逻辑回归的误差函数,也被称为损失函数,是由极大似然估计推导出来的。对于二分类问题,我们可以定义损失函数如下
其中,
| 符号标记 | 描述 |
|---|---|
| X_train | 训练数据(训练). |
| X_test | 测试数据(评估). |
| X | 完整数据. |
| y_train | 训练集标签(训练). |
| y_test | 测试集标签(评估). |
| y | 数据标签. |
# 导入scikit-learn库中的datasets模块和preprocessing模块
from sklearn import datasets, preprocessing
# 导入scikit-learn库中的train_test_split函数,用于分割数据集
from sklearn.model_selection import train_test_split
# 导入scikit-learn库中的LinearRegression线性回归模型
from sklearn.linear_model import LinearRegression
# 导入scikit-learn库中的r2_score函数,用于计算R²分数来评估模型性能
from sklearn.metrics import r2_score
# 导入scikit-learn库中的load_iris函数,用于加载鸢尾花数据集
from sklearn.datasets import load_iris
# 使用load_iris函数加载鸢尾花数据集,将数据集存储在变量iris中
iris = load_iris()
# 从iris变量中提取特征数据(鸢尾花的测量数据),并将其存储在变量X中
X = iris.data
# 从iris变量中提取目标数据(鸢尾花的类别标签),并将其存储在变量y中
y = iris.target
load_iris数据集是机器学习领域中经常用于示例和练习的经典数据集之一。这个数据集包含了鸢尾花的特征和类别信息,用于分类问题。 load_iris数据集的详细描述:
数据来源:这个数据集最早由统计学家和生物学家Ronald A. Fisher在1936年收集。它包含了来自三种不同鸢尾花品种(Setosa、Versicolor和Virginica)的样本数据。
特征:每个样本包含四个特征,这些特征是鸢尾花的四个形态特征,包括花萼(sepal)的长度和宽度,以及花瓣(petal)的长度和宽度,都以厘米为单位。因此,每个样本有四个特征。
目标变量:除了特征数据之外,每个样本还有一个对应的目标标签,表示鸢尾花的品种。共有三个类别,分别代表三种不同的鸢尾花。
总样本数:load_iris数据集包含150个样本,其中每种鸢尾花品种各有50个样本。
#view data description and information
print(iris.DESCR)
import pandas as pd
#make sure to save the data frame to a variable
data = pd.DataFrame(iris.data)
data.head()
#note: it is common practice to use underscores between words, and avoid spaces
data.columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
data.head()
# 将完整数据集的70%作为训练集,30%作为测试集
# 并使得测试集和训练集中各类别数据的比例与原始数据集比例一致(stratify分层策略)
# 另外可通过设置 shuffle=True 提前打乱数据
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test =
train_test_split(X, y, random_state=12, stratify=y, test_size=0.3)
# 导入scikit-learn库中的StandardScaler类,用于特征标准化
from sklearn.preprocessing import StandardScaler
# 创建一个StandardScaler对象,该对象将用于对数据进行特征标准化
scaler = StandardScaler()
# 使用fit_transform方法,对训练数据集 X_train 进行特征标准化的拟合和转换操作
# 特征标准化的目的是将特征数据进行缩放,使其具有零均值和单位方差
# 这有助于提高模型性能,尤其是对于某些机器学习算法,如支持向量机和K均值聚类
# X_train是训练数据集中的特征数据,经过拟合和转换后,标准化后的特征数据将存储在新的变量中
# 通常,这个新的变量不仅会存储标准化后的数据,还会覆盖原始的X_train
scaler.fit_transform(X_train)
| 预处理器/变换器 | 描述 |
|---|---|
MinMaxScaler |
将特征缩放到指定范围内,通常是 [0, 1]。 |
| OneHotEncoder | 将分类特征转换为二进制形式。 |
| Normalizer | 对每个样本的特征进行标准化或归一化。 |
| Binarizer | 将数值特征二进制化,根据阈值进行转换。 |
| LabelEncoder | 将类别标签转换为整数标签。 |
| Imputer | 用于处理缺失数据,替换缺失值为统计值。 |
| PolynomialFeatures | 生成原始特征的多项式特征。 |
MinMaxScaler:
| 特征选择方法 | 描述 | 主要参数 |
|---|---|---|
SelectKBest(score_func, k) |
选择K个最重要的特征。 | score_func: 评分函数,k: 特征数量。 |
RFECV(estimator, scoring) |
递归特征消除交叉验证,通过逐步删除不重要的特征。 | estimator: 模型估计器,scoring: 评分标准(默认为 "r2")。 |
SelectFromModel(estimator) |
根据模型的特征重要性选择最重要的特征。 | estimator: 带有特征重要性评估功能的模型估计器。 |
# 导入Scikit-Learn库中的线性回归模型,即 LinearRegression
from sklearn.linear_model import LinearRegression
# 构建LinearRegression 类的实例,命名为 lr。normalize=True 表示在拟合模型时对特征进行标准化。
lr = LinearRegression(normalize=True)
# 训练模型,使用 fit 方法拟合线性回归模型
lr.fit(X_train, y_train)
# 作出预测,使用 predict 方法对测试数据集 X_test 进行预测,将结果存储在 y_pred 变量中。
y_pred = lr.predict(X_test)
LASSO linear_model.Lasso # 基于L1正则化的线性回归模型。
Ridge linear_model.Ridge # 是基于L2正则化的线性回归模型。
ElasticNet linear_model.ElasticNet # 同时使用L1和L2正则化的线性回归模型。
回归树 tree.DecisionTreeRegressor # 一种非线性回归模型,通过构建树结构来建模数据的关系。
# 导入决策树分类器类
from sklearn.tree import DecisionTreeClassifier
# 创建一个决策树分类器的实例
clf = DecisionTreeClassifier(max_depth=5)
# 这里的 max_depth 是树的最大深度,可以根据问题调整以控制树的复杂性
# 使用训练数据拟合(训练)分类器
clf.fit(X_train, y_train)
# X_train 是训练数据集的特征,y_train 是相应的目标值
# 使用训练好的分类器进行预测
y_pred = clf.predict(X_test)
# X_test 是测试数据集的特征,y_pred 存储了预测的分类标签
# 获取分类的概率估计值
y_prob = clf.predict_proba(X_test)
# X_test 是测试数据集的特征,y_prob 存储了每个类别的概率估计值
# 使用决策树分类算法解决二分类问题, y_prob 为每个样本预测为“0”和“1”类的概率
| 分类器/方法 | 描述 |
|---|---|
linear_model.LogisticRegression |
逻辑回归模型,用于分类任务。 |
svm.SVC |
支持向量机分类器,用于数据分割成类别。 |
naive_bayes.GaussianNB |
朴素贝叶斯分类器,适用于处理连续型特征的分类问题。 |
neighbors.NearestNeighbors |
最近邻搜索方法,通常用于无监督学习和数据降维。 |
评价指标
sklearn.metrics模块包含了一系列用于评价模型的评分函数、损失函数以及成对数据的距离度量函数. from sklearn.metrics import accuracy_score accuracy_score(y_true, y_pred). 对于测试集而言,y_test即是y_true,大部分函数都必须包含真实值y_true和预测值y_pred.
回归模型评价
metrics.mean_absolute_error() | 平均绝对误差MAE
metrics.mean_squared_error() | 均方误差MSE
metrics.r2_score() | 决定系数R2.
分类模型评价
metrics.accuracy_score() | 正确率 metrics.precision_score() | 各类精确率 metrics.f1_score() | F1 值
metrics.log_loss() | 对数损失或交叉熵损失 metrics.confusion_matrix | 混淆矩阵
metrics.classification_report | 含多种评价的分类报告
使用 AdaBoost 的决策树回归
# Author: Noel Dawe <noel.dawe@gmail.com>
#
# License: BSD 3 clause
import numpy as np
rng = np.random.RandomState(1)
X = np.linspace(0, 6, 100)[:, np.newaxis]
y = np.sin(X).ravel() + np.sin(6 * X).ravel() + rng.normal(0, 0.1, X.shape[0])
使用 AdaBoost 的决策树回归:
2. 使用决策树和 AdaBoost 回归器进行训练和预测
# 现在,我们定义分类器并将它们拟合到数据中。
# 然后,我们根据相同的数据进行预测,看看它们能很好地拟合它。
# 第一个回归量是 with. 第二个回归器是一个具有 of 作为基本学习器,
# 并将使用这些基本学习器构建。
# DecisionTreeRegressormax_depth
# =4AdaBoostRegressorDecisionTreeRegressormax_depth=4n_estimators=300
from sklearn.ensemble import AdaBoostRegressor
from sklearn.tree import DecisionTreeRegressor
regr_1 = DecisionTreeRegressor(max_depth=4)
regr_2 = AdaBoostRegressor(
DecisionTreeRegressor(max_depth=4), n_estimators=300, random_state=rng
)
regr_1.fit(X, y)
regr_2.fit(X, y)
y_1 = regr_1.predict(X)
y_2 = regr_2.predict(X)
使用 AdaBoost 的决策树回归
3. 拟合数据:
import matplotlib.pyplot as plt
import seaborn as sns
colors = sns.color_palette("colorblind")
plt.figure()
plt.scatter(X, y, color=colors[0], label="training samples")
plt.plot(X, y_1, color=colors[1], label="n_estimators=1", linewidth=2)
plt.plot(X, y_2, color=colors[2], label="n_estimators=300", linewidth=2)
plt.xlabel("data")
plt.ylabel("target")
plt.title("Boosted Decision Tree Regression")
plt.legend()
plt.show()

常用的回归:线性、决策树、SVM、KNN ;集成回归:随机森林、Adaboost、GradientBoosting、Bagging、ExtraTrees 常用的分类:线性、决策树、SVM、KNN,朴素贝叶斯;集成分类:随机森林、Adaboost、GradientBoosting、Bagging、ExtraTrees 常用聚类:k均值(K-means)、层次聚类(Hierarchical clustering)、DBSCAN 常用降维:LinearDiscriminantAnalysis、PCA 这个流程图代表:蓝色圆圈是判断条件,绿色方框是可以选择的算法,我们可以根据自己的数据特征和任务目标去找一条自己的操作路线。 sklearn中包含众多数据预处理和特征工程相关的模块,虽然刚接触sklearn时,大家都会为其中包含的各种算法的广度深度所震惊,但其实sklearn六大板块中有两块都是关于数据预处理和特征工程的,两个板块互相交互,为建模之前的全部工程打下基础。
<div style="text-align:center"> $\hat{y}=x_{1} w_{1}+x_{2} w_{2}+b$ </div>
## 5.2 机器学习模型构建和常用库 - scikit-learn多元回归分析 <font size=5> 解这个线性方程组将得到$w_1$、$w_2$和$b$的解析解,它们是多元线性回归模型的系数。最终的`解析解`为: $$w_1 = \frac{\sum_{i=1}^{n} x_{1i}(\hat{y}_i - y_i)}{\sum_{i=1}^{n} x_{1i}^2}$$ $$w_2 = \frac{\sum_{i=1}^{n} x_{2i}(\hat{y}_i - y_i)}{\sum_{i=1}^{n} x_{2i}^2}$$ $$b = \frac{\sum_{i=1}^{n} (\hat{y}_i - y_i)}{n}$$ </font> ---