网站首页 > 技术文章 正文
机器学习算法-K近邻(KNN)-鸢尾花-分类算法可视化
计算机对新闻自动分类,最关键的技术竟然是余弦定理
引言
在当今数据驱动的时代,机器学习算法已成为解决各种复杂问题的强大工具。然而,要充分发挥机器学习算法的潜力,仅仅了解其基本原理是远远不够的。掌握一系列实用的技巧对于优化模型性能、提高数据处理效率以及获得更准确的预测结果至关重要。本文将深入探讨 Python 机器学习算法中的关键技巧,涵盖数据预处理、模型选择与评估、算法调优等多个方面,通过详细的示例和清晰的讲解,为你揭示机器学习算法背后的奥秘,助力你在机器学习的征程中取得更好的成果。
一、数据预处理技巧
(一)特征缩放
- 标准化(Standardization)许多机器学习算法在数据具有相似的尺度时表现更好。标准化是将数据转换为均值为 0,标准差为 1 的分布。在scikit - learn中,可以使用StandardScaler来实现。示例:
from sklearn.preprocessing import StandardScaler
import numpy as np
X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
print(X_scaled)
- 归一化(Normalization)归一化是将数据缩放到一个特定的区间,通常是 [0, 1]。MinMaxScaler是scikit - learn中用于归一化的工具。示例:
from sklearn.preprocessing import MinMaxScaler
X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]])
min_max_scaler = MinMaxScaler()
X_norm = min_max_scaler.fit_transform(X)
print(X_norm)
(二)处理缺失值
- 删除包含缺失值的样本或特征当数据集中缺失值较少时,可以考虑删除包含缺失值的行或列。在pandas中,可以使用dropna方法。示例:
import pandas as pd
data = pd.DataFrame({'A': [1, 2, np.nan], 'B': [4, np.nan, 6], 'C': [7, 8, 9]})
data_dropped_rows = data.dropna()
print(data_dropped_rows)
data_dropped_cols = data.dropna(axis = 1)
print(data_dropped_cols)
- 插补(Imputation)更常用的方法是插补缺失值。scikit - learn中的SimpleImputer可以用均值、中位数、众数等统计量来填充缺失值。示例:
from sklearn.impute import SimpleImputer
import numpy as np
imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean')
data = np.array([[1., 2.], [np.nan, 3.], [7., 6.]])
data_imputed = imp_mean.fit_transform(data)
print(data_imputed)
- 根据数据的分布和特征的性质选择合适的插补策略很重要。例如,对于正态分布的特征,用均值插补可能比较合适;对于分类特征,众数插补可能更合适。
二、模型选择与评估技巧
(一)交叉验证(Cross - Validation)
- K - 折交叉验证(K - Fold Cross - Validation)K - 折交叉验证是一种评估模型性能的常用方法。它将数据集分成 K 个大小相似的互斥子集,每次用 K - 1 个子集作为训练集,剩下的一个子集作为验证集,重复 K 次。scikit - learn中的KFold类可以实现这个过程。示例:
from sklearn.model_selection import KFold
import numpy as np
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([1, 2, 3, 4])
kf = KFold(n_splits = 4)
for train_index, test_index in kf.split(X):
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
print("TRAIN:", train_index, "TEST:", test_index)
print(X_train, X_test, y_train, y_test)
- 通过 K - 折交叉验证,可以得到更稳定的模型性能评估结果,减少过拟合或欠拟合的影响。
- 分层 K - 折交叉验证(Stratified K - Fold Cross - Validation)当数据集中的目标变量有类别不平衡问题时,分层 K - 折交叉验证很有用。它确保每个折中的类别比例与整个数据集的类别比例相似。StratifiedKFold类用于实现这个功能。示例:
from sklearn.model_selection import StratifiedKFold
import numpy as np
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([0, 0, 1, 1])
skf = StratifiedKFold(n_splits = 2)
for train_index, test_index in skf.split(X, y):
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
print("TRAIN:", train_index, "TEST:", test_index)
print(X_train, X_test, y_train, y_test)
(二)模型选择指标
- 分类模型指标准确率(Accuracy):是分类正确的样本数占总样本数的比例。但在类别不平衡的情况下,准确率可能会产生误导。精确率(Precision)、召回率(Recall)和 F1 - Score:精确率是指被分类为正例的样本中真正为正例的比例;召回率是指实际为正例的样本中被正确分类为正例的比例;F1 - Score 是精确率和召回率的调和平均数。示例(使用scikit - learn计算指标):
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
y_true = [0, 1, 1, 0]
y_pred = [0, 1, 0, 0]
accuracy = accuracy_score(y_true, y_pred)
precision = precision_score(y_true, y_pred)
recall = recall_score(y_true, y_pred)
f1 = f1_score(y_true, y_pred)
print("Accuracy:", accuracy)
print("Precision:", precision)
print("Recall:", recall)
print("F1 - Score:", f1)
- 回归模型指标均方误差(MSE - Mean Squared Error):计算预测值与真实值之间差值的平方的平均值。MSE 的值越小,模型的预测效果越好。平均绝对误差(MAE - Mean Absolute Error):计算预测值与真实值之间差值的绝对值的平均值。它对异常值的敏感度比 MSE 低。决定系数(R - squared):衡量模型对数据的拟合程度,取值范围在 0 到 1 之间,越接近 1 表示模型拟合得越好。示例(使用scikit - learn计算指标):
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mse = mean_squared_error(y_true, y_pred)
mae = mean_absolute_error(y_true, y_pred)
r2 = r2_score(y_true, y_pred)
print("MSE:", mse)
print("MAE:", mae)
print("R - squared:", r2)
三、算法调优技巧
(一)超参数调整
- 网格搜索(Grid Search)网格搜索是一种简单的超参数调整方法。它通过穷举所有可能的超参数组合,来找到最佳的超参数设置。scikit - learn中的GridSearchCV类可以方便地实现网格搜索。示例(以支持向量机为例,调整C和gamma参数):
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
import numpy as np
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([0, 0, 1, 1])
param_grid = {'C': [1, 10, 100], 'gamma': [0.1, 0.01, 0.001]}
grid_search = GridSearchCV(SVC(), param_grid, cv = 2)
grid_search.fit(X, y)
print("Best parameters:", grid_search.best_params_)
print("Best score:", grid_search.best_score_)
- 网格搜索虽然简单有效,但当超参数的搜索空间很大时,计算成本会很高。
- 随机搜索(Random Search)随机搜索是在超参数空间中随机采样一定数量的组合来进行评估。它比网格搜索更高效,尤其是在超参数空间较大时。RandomizedSearchCV类用于随机搜索。示例(同样以支持向量机为例):
from sklearn.model_selection import RandomizedSearchCV
from sklearn.svm import SVC
import numpy as np
import scipy.stats as stats
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([0, 0, 1, 1])
param_distributions = {'C': stats.uniform(1, 100), 'gamma': stats.uniform(0.001, 0.1)}
random_search = RandomizedSearchCV(SVC(), param_distributions, n_iter = 10, cv = 2)
random_search.fit(X, y)
print("Best parameters:", random_search.best_params_)
print("Best score:", random_search.best_score_)
(二)集成学习技巧
- Bagging(Bootstrap Aggregating)Bagging 是一种通过构建多个独立的模型并将它们的预测结果进行平均或投票来提高模型性能的方法。scikit - learn中的BaggingClassifier(分类)和BaggingRegressor(回归)可以实现这个过程。示例(以决策树为例构建 Bagging 分类器):
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
import numpy as np
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([0, 0, 1, 1])
bagging_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators = 10)
bagging_clf.fit(X, y)
- Bagging 可以减少模型的方差,提高模型的稳定性和泛化能力。
- BoostingBoosting 是一种迭代的集成学习方法,它通过逐步调整训练样本的权重,使得后续的模型更加关注之前模型误分类的样本。AdaBoost、Gradient Boosting和XGBoost等是常见的 Boosting 算法。以AdaBoost为例:
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
import numpy as np
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([0, 0, 1, 1])
ada_clf = AdaBoostClassifier(DecisionTreeClassifier(), n_estimators = 10)
ada_clf.fit(X, y)
- Boosting 方法通常可以提高模型的准确性,但可能会过拟合,需要注意调整参数来控制模型的复杂度。
结束语
通过掌握本文所介绍的 Python 机器学习算法技巧,你将能够在机器学习项目中更加得心应手。从数据预处理的精细操作到模型选择与评估的准确把握,再到算法调优的巧妙应用,每一个环节都蕴含着提升模型性能和效果的关键。在实际应用中,不断地实践和探索这些技巧,结合具体的数据集和问题场景进行调整和优化,你将逐步积累经验,取得更加出色的机器学习成果。无论是在学术研究还是工业应用中,这些技巧都将成为你有力的武器,帮助你挖掘数据的价值,解决实际问题,推动机器学习领域的不断发展。希望本文能为你在 Python 机器学习的道路上点亮一盏明灯,引领你走向成功的彼岸。
- 上一篇: 用机器学习来提升你的用户增长:第五步,预测客户的下一个购买日
- 下一篇: 浅谈支持向量机(2)
猜你喜欢
- 2024-11-24 7000字,Python分析:泰坦尼克号中女生更容易生还?
- 2024-11-24 SVM 算法 和 梅尔倒谱系数 结合使用噪音检测的应用
- 2024-11-24 scikit-learn的5大新功能
- 2024-11-24 机器学习集成方法:Bagging, Boosting, Stacking, Voting, Blending
- 2024-11-24 Kaggle练习赛---Titanic的分析与整理
- 2024-11-24 超参数自动调参库介绍
- 2024-11-24 支持向量机SVM(Support Vector Machine) Ⅰ原创 Yu
- 2024-11-24 集成学习小介
- 2024-11-24 如何利用手机远训练机器学习模型
- 2024-11-24 使用SVC支持向量机算法来进行人脸识别的CNN神经网络训练
- 最近发表
-
- 使用Knative部署基于Spring Native的微服务
- 阿里p7大佬首次分享Spring Cloud学习笔记,带你从0搭建微服务
- ElasticSearch进阶篇之搞定在SpringBoot项目中的实战应用
- SpringCloud微服务架构实战:类目管理微服务开发
- SpringBoot+SpringCloud题目整理
- 《github精选系列》——SpringBoot 全家桶
- Springboot2.0学习2 超详细创建restful服务步骤
- SpringCloud系列:多模块聚合工程基本环境搭建「1」
- Spring Cloud Consul快速入门Demo
- Spring Cloud Contract快速入门Demo
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)