一、Scikit-learn
Scikit-learn 是 开源的Python库,通过统一的界面实现机器学习、预处理、交叉验证及可视化算法。
>>> from sklearn import neighbors, datasets, preprocessing >>> from sklearn.model_selection import train_test_split >>> from sklearn.metrics import accuracy_score >>> iris = datasets.load_iris() >>> X, y = iris.data[:, :2], iris.target >>> X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=33) >>> scaler = preprocessing.StandardScaler().fit(X_train) >>> X_train = scaler.transform(X_train) >>> X_test = scaler.transform(X_test) >>> knn = neighbors.KNeighborsClassifier(n_neighbors=5) >>> knn.fit(X_train, y_train) >>> y_pred = knn.predict(X_test) >>> accuracy_score(y_test, y_pred)
以上是使用 scikit-learn 库 进行 k-最近邻(KNN)分类的流程,得到 KNN 分类器在 iris 数据集上的预测准确率。
二、加载数据
Scikit-learn 处理的数据是存储为 NumPy 数组或 SciPy 稀疏矩阵的数字,还支持 Pandas 数据框等可转换为数字数组的其它数据类型。
>>> import numpy as np # 导入了 NumPy 库,用于进行数值计算和数组操作 >>> X = np.random.random((10,5)) >>> y = np.array(['M','M','F','F','M','F','M','M','F','F','F']) >>> X[X < 0.7] = 0
以上我们使用了 NumPy 库来生成一个随机的 10 行 5 列的矩阵 X,并将小于 0.7 的元素置为 0。同时,创建了一个包含性别标签的 NumPy 数组 y。我们得到一个形状为 (10, 5) 的随机矩阵 X,其中小于 0.7 的元素被置为 0,并创建了一个包含性别标签的数组 y。这些数据可以用于接下来的 分析、 建模 或其他任务中。
三、训练集与测试集数据
使用了 scikit-learn 库的 train_test_split 函数,将数据集划分为 训练集 和 测试集。
>>> from sklearn.model_selection import train_test_split >>> X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
得到划分后的训练集和测试集的特征数据 X_train、X_test,以及对应的类别标签数据 y_train、y_test。可以在训练集上进行模型训练,然后使用测试集评估模型的性能和准确率。
四、创建模型
4.1 有监督学习评估器
4.1.1 线性回归
我们使用 scikit-learn 库的 LinearRegression 类,创建一个线性回归模型对象。
>>> from sklearn.linear_model import LinearRegression >>> lr = LinearRegression(normalize=True)
创建一个线性回归模型对象 lr。
4.1.2 支持向量机(SVM)
我们使用 scikit-learn 库的 SVC 类,创建一个 支持向量机(SVM)模型对象。
>>> from sklearn.svm import SVC >>> svc = SVC(kernel='linear')
创建一个支持向量机模型对象 svc,并 使用线性核函数进行分类。
4.1.3 朴素贝叶斯
使用 scikit-learn 库的 GaussianNB 类,创建一个 朴素贝叶斯模型对象。
>>> from sklearn.naive_bayes import GaussianNB >>> gnb = GaussianNB()
创建一个朴素贝叶斯模型对象 gnb。朴素贝叶斯模型是一种常用的概率模型,适用于 分类问题。
4.1.4 KNN
使用 scikit-learn 库的 neighbors 模块,创建一个 K 最近邻(KNN)分类器对象。
>>> from sklearn import neighbors >>> knn = neighbors.KNeighborsClassifier(n_neighbors=5)
创建一个 KNN 分类器对象 knn,它会 根据最近的邻居来进行分类。KNN 是一种 基于实例的学习方法,根据最近邻居的标签进行分类。
4.2 无监督学习评估器
4.2.1 主成分分析(PCA)
使用 scikit-learn 库的 PCA 类,创建一个 主成分分析(PCA)对象。
>>> from sklearn.decomposition import PCA >>> pca = PCA(n_components=0.95)
创建一个 PCA 对象 pca,它可以用于降维或特征提取。PCA 是一种常用的降维技术,可 将高维数据映射到低维空间,保留数据的主要特征。
4.2.2 K Means
使用 scikit-learn 库的 KMeans 类,创建一个 K-Means 聚类器对象。
>>> from sklearn.cluster import KMeans >>> k_means = KMeans(n_clusters=3, random_state=0)
创建一个 K-Means 聚类器对象 k_means,它将根据数据点之间的距离进行聚类。K-Means 是一种常用的聚类算法,将数据点分割成预定义数量的簇,使得簇内的数据点尽可能相似,而不同簇之间的数据点差异较大。
五、模型拟合
5.1 有监督学习
展示了 三种不同的机器学习算法在训练集上进行训练的过程。
# 拟合数据与模型 >>> lr.fit(X, y) # 使用逻辑回归算法(Logistic Regression)对数据集(X, y)进行拟合。其中,X是输入特征矩阵,y是对应的目标变量向量 >>> knn.fit(X_train, y_train) # 使用K近邻算法(K-Nearest Neighbors)对训练集(X_train, y_train)进行拟合。其中,X_train是训练集的输入特征矩阵,y_train是对应的目标变量向量 >>> svc.fit(X_train, y_train) # 使用支持向量机算法(Support Vector Machine)对训练集(X_train, y_train)进行拟合。其中,X_train是训练集的输入特征矩阵,y_train是对应的目标变量向量
5.2 无监督学习
对训练集进行聚类和特征降维的过程如下。
>>> k_means.fit(X_train) # 拟合数据与模型 >>> pca_model = pca.fit_transform(X_train) # 拟合并转换数据
模型会根据给定的训练集数据对 K-Means 聚类算法和 PCA 算法进行拟合。对于 K-Means 聚类算法,模型会 学习找到最佳的簇中心点;对于 PCA 算法,模型会 学习找到最佳的主成分投影空间。这些拟合操作会生成相应的模型或转换对象,以便于之后对新的数据进行聚类或降维操作。
六、拟合数据与模型
6.1 标准化
以下是对训练集和测试集进行数据标准化的过程。
>>> from sklearn.preprocessing import StandardScaler >>> scaler = StandardScaler().fit(X_train) >>> standardized_X = scaler.transform(X_train) >>> standardized_X_test = scaler.transform(X_test)
创建一个 StandardScaler 对象 scaler,并 使用训练集的数据对其进行拟合。然后,我们可以使用 scaler 对训练集和测试集进行标准化转换,以确保数据具有相同的尺度和范围,以 提高模型的训练和预测效果。
6.2 归一化
接下来我们学习对训练集和测试集进行数据归一化。
>>> from sklearn.preprocessing import Normalizer >>> scaler = Normalizer().fit(X_train) >>> normalized_X = scaler.transform(X_train) >>> normalized_X_test = scaler.transform(X_test)
创建一个 Normalizer 对象 scaler,并使用训练集的数据对其进行拟合。然后,我们可以 使用 scaler 对训练集和测试集进行归一化转换,以确保数据在特征向量方向上具有单位范数。归一化可以使得不同样本之间的特征向量更具可比性,并且有助于某些机器学习算法的训练和预测效果。
6.3 二值化
这里展示了对数据集进行二值化处理的过程。
>>> from sklearn.preprocessing import Binarizer >>> binarizer = Binarizer(threshold=0.0).fit(X) >>> binary_X = binarizer.transform(X)
创建一个 Binarizer 对象 binarizer,并使用阈值 threshold=0.0 对数据集 X 进行二值化处理。然后,我们可以 使用 binarizer 对数据集进行二进制转换,并将结果保存在变量 binary_X 中。二值化可以使得不同样本之间的特征更具可比性,并且有助于某些机器学习算法的训练和预测效果。
6.4 编码分类特征
使用 LabelEncoder对目标变量进行标签编码的过程。
>>> from sklearn.preprocessing import LabelEncoder >>> enc = LabelEncoder() >>> y = enc.fit_transform(y)
创建一个 LabelEncoder 对象 enc,并使用其 fit_transform 方法对目标变量 y 进行标签编码处理。编码后的结果会覆盖原目标变量 y 的值,使得原本的标签被替换为相应的整数编码。标签编码常用于将非数字类型的目标变量转换为模型可接受的数字形式,以便进行机器学习任务的训练和预测。
6.5 输入缺失值
使用 Imputer 对象对数据集中的缺失值进行填充。
>>> from sklearn.preprocessing import Imputer >>> imp = Imputer(missing_values=0, strategy='mean', axis=0) >>> imp.fit_transform(X_train)
创建一个 Imputer 对象 imp,并使用其 fit_transform 方法对训练集 X_train 中的缺失值进行填充处理。填充后的结果会覆盖原始的训练集数据 X_train,使得缺失值被替换为相应列的均值。Imputer 类常用于在数据预处理阶段处理缺失值,以保证数据集的完整性和准确性。
6.6 生成多项式特征
使用 PolynomialFeatures 对特征进行多项式扩展。
>>> from sklearn.preprocessing import PolynomialFeatures >>> poly = PolynomialFeatures(5) >>> poly.fit_transform(X)
创建一个 PolynomialFeatures 对象 poly,并使用其 fit_transform 方法对数据集 X 进行多项式扩展处理。扩展后的结果会包含原始特征的各种次方组合,从一次项到最高次数为 5 的项。多项式扩展常用于增加模型的复杂度,以捕捉特征之间的非线性关系,从而提升模型的预测能力。
七、评估模型性能
7.1 评估模型性能
7.1.1 准确率
使用 scikit-learn 中的评估器评分法和指标评分函数来评估模型的准确性。
>>> knn.score(X_test, y_test) # 评估器评分法 >>> from sklearn.metrics import accuracy_score # 指标评分函数 >>> accuracy_score(y_test, y_pred)
可以使用评估器评分法或指标评分函数来评估模型在测试集上的准确性。评估器评分法直接调用模型对象的 score 方法,而指标评分函数则需要传入真实目标变量数据和预测结果数据来计算准确性得分。这些评估方法可以帮助我们 了解模型的性能,并 比较不同模型之间的表现。
7.1.2 分类预估评价函数
使用 scikit-learn 中的 classification_report 函数 来生成分类模型的精确度、召回率、F1指数和支持率等评估指标报告。
>>> from sklearn.metrics import classification_report # 精确度、召回率、F1分数及支持率 >>> print(classification_report(y_test, y_pred))
可以使用 classification_report 函数生成分类模型的评估指标报告。该报告会包含每个类别的精确度、召回率、F1指数和支持率等指标,以及加权平均值和总平均值。这些指标可以帮助我们评估模型在不同类别上的表现,并提供关于模型性能的详细信息。
7.1.3 混淆矩阵
使用 scikit-learn 中的 confusion_matrix 函数来 生成分类模型的混淆矩阵。
>>> from sklearn.metrics import confusion_matrix >>> print(confusion_matrix(y_test, y_pred))
使用 confusion_matrix 函数生成分类模型的混淆矩阵。混淆矩阵以矩阵的形式展示了模型在各个类别上的分类结果,包括 真正例、假正例、假负例 和 真负例的数量。这样,我们就可以根据混淆矩阵来评估模型在不同类别上的分类性能,并进一步分析误分类的情况。
7.2 回归指标
7.2.1 平均绝对误差
使用 scikit-learn 中的 mean_absolute_error 函数来计算回归模型的平均绝对误差(Mean Absolute Error)。
>>> from sklearn.metrics import mean_absolute_error >>> y_true = [3, -0.5, 2] >>> mean_absolute_error(y_true, y_pred)
使用 mean_absolute_error 函数计算回归模型的平均绝对误差。该指标 衡量模型的预测结果与真实值之间的平均偏差程度,数值越小表示模型的预测越准确。使用平均绝对误差可以帮助您评估回归模型的性能,并比较不同模型之间的表现。
7.2.2 均方误差
使用 scikit-learn 中的 mean_squared_error 函数来计算回归模型的均方误差(Mean Squared Error)。
>>> from sklearn.metrics import mean_squared_error >>> mean_squared_error(y_test, y_pred)
使用 mean_squared_error 函数计算回归模型的均方误差。该指标衡量了模型的预测结果与真实值之间的平均差异程度,数值越小表示模型的预测越准确。使用均方误差可以帮助我们评估回归模型的性能,并比较不同模型之间的表现。
7.2.3 R²评分
使用 scikit-learn 中的 r2_score 函数来计算 回归模型的 R² 分数(R-squared score)。
>>> from sklearn.metrics import r2_score >>> r2_score(y_true, y_pred)
通过执行这些代码,可以使用 r2_score 函数计算回归模型的 R² 分数,即确定性系数或拟合优度。R² 分数的取值范围在 0 到 1 之间,数值越接近 1 表示模型对数据的拟合程度越好,而越接近 0 则表示模型的拟合效果较差。R² 分数可以帮助我们评估回归模型的性能,并与其他模型进行比较。
7.3 群集指标
7.3.1 调整兰德系数
使用 scikit-learn 中的 adjusted_rand_score 函数来计算聚类算法的调整兰德指数(Adjusted Rand Index)。
>>> from sklearn.metrics import adjusted_rand_score >>> adjusted_rand_score(y_true, y_pred)
使用 adjusted_rand_score 函数计算聚类算法的调整兰德指数。调整兰德指数的取值范围在 -1 到 1 之间,数值越接近 1 表示聚类结果与真实标签的一致性越高,而数值越接近 0 表示聚类结果与随机划分的一致性一样,数值越接近 -1 表示聚类结果与真实标签的一致性越低。调整兰德指数可以帮助评估聚类算法的性能,并与其他算法进行比较。
7.3.2 同质性
使用 scikit-learn 中的 homogeneity_score 函数来计算聚类结果的同质性得分(Homogeneity Score)。
>>> from sklearn.metrics import homogeneity_score >>> homogeneity_score(y_true, y_pred)
使用 homogeneity_score 函数计算聚类结果的同质性得分。同质性得分的取值范围在 0 到 1 之间,数值越接近 1 表示聚类结果中的样本更倾向于同属于一个类别的聚类簇,而数值越接近 0 表示聚类结果的同质性较差,样本分布更分散。同质性得分可以帮助评估聚类算法在保持同类样本集中性方面的性能,并与其他算法进行比较。
7.3.3 V-measure
使用 scikit-learn 中的 v_measure_score 函数来计算聚类结果的 V-measure 分数。
>>> from sklearn.metrics import v_measure_score >>> v_measure_score(y_true, y_pred)
使用 v_measure_score 函数计算聚类结果的 V-measure 分数。V-measure 分数的取值范围在 0 到 1 之间,数值越接近 1 表示聚类结果的同质性和完整性越高,而数值越接近 0 表示聚类结果的质量较差。
7.4 交叉验证
使用 scikit-learn 中的 cross_val_score 函数来进行 交叉验证 并 计算模型的性能评估指标。
>>> from sklearn.cross_validation import cross_val_score >>> print(cross_val_score(knn, X_train, y_train, cv=4)) >>> print(cross_val_score(lr, X, y, cv=2))
使用 cross_val_score 函数对模型进行交叉验证并计算性能评估指标。交叉验证可以帮助我们更全面地评估模型的性能,并确保评估指标的可靠性。在交叉验证中,输入数据会被分成若干个折(即交叉验证的折数),每一折轮流作为验证集,剩余折作为训练集,用于拟合模型并计算性能评估指标。最终,所有折的性能评估指标会被汇总,得出 模型的平均性能评估指标。
八、模型调整
8.1 栅格搜索
使用 scikit-learn 中的 GridSearchCV 类来进行 网格搜索 和 参数调优。
>>> from sklearn.grid_search import GridSearchCV >>> params = {"n_neighbors": np.arange(1,3), "metric": ["euclidean", "cityblock"]} >>> grid = GridSearchCV(estimator=knn, param_grid=params) >>> grid.fit(X_train, y_train) >>> print(grid.best_score_) >>> print(grid.best_estimator_.n_neighbors)
通过执行这些代码,可以使用 GridSearchCV 类对模型的参数空间进行穷举搜索,并找到最佳的参数组合。网格搜索可以帮助我们找到最优的参数设置,从而提高模型的性能。在搜索过程中,将对每一组参数进行交叉验证,并根据性能评估指标选择最佳的参数组合。
8.2 随机参数优化
使用 scikit-learn 中的 RandomizedSearchCV 类来进行 随机搜索 和 参数调优。
>>> from sklearn.grid_search import RandomizedSearchCV >>> params = {"n_neighbors": range(1,5), "weights": ["uniform", "distance"]} >>> rsearch = RandomizedSearchCV(estimator=knn, param_distributions=params, cv=4, n_iter=8, random_state=5) >>> rsearch.fit(X_train, y_train) >>> print(rsearch.best_score_)
使用 RandomizedSearchCV 类对模型的参数空间进行随机搜索,并找到最佳的参数组合。随机搜索相比于网格搜索,可以更高效地在大范围的参数空间中寻找最佳参数组合。在搜索过程中,将对每一组参数进行交叉验证,并根据性能评估指标选择最佳的参数组合。