赞
踩
1.线性回归算法(Linear Regression):线性回归是一种用于预测数值类型的机器学习算法。它通过建立一个关于自变量和因变量之间的线性关系来对数据进行建模。案例实现:波士顿房价预测
- from sklearn.model_selection import train_test_split
- from sklearn.linear_model import LinearRegression
- from sklearn.datasets import make_regression
- import matplotlib.pyplot as plt
-
- # 生成线性回归数据集
- X, y = make_regression(n_samples=100, n_features=1, noise=0.1)
-
- # 划分训练集和测试集
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
-
- # 创建并训练模型
- model = LinearRegression()
- model.fit(X_train, y_train)
-
- # 预测
- y_pred = model.predict(X_test)
-
- # 可视化结果
- plt.scatter(X_test, y_test, color='blue', label='True data')
- plt.plot(X_test, y_pred, color='red', linewidth=2, label='Predicted data')
- plt.legend()
- plt.show()
2.逻辑回归算法(Logistic Regression):逻辑回归是一种用于预测分类类型的机器学习算法。它通过将数据映射到概率空间来对数据进行建模。案例实现:信用卡欺诈检测。
- from sklearn.model_selection import train_test_split
- from sklearn.linear_model import LogisticRegression
- from sklearn.datasets import load_iris
-
- # 加载鸢尾花数据集
- iris = load_iris()
- X = iris.data[:, :2] # 只使用前两个特征
- y = (iris.target != 0) * 1 # 将类别转换为二分类问题
-
- # 划分训练集和测试集
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
-
- # 创建并训练模型
- model = LogisticRegression()
- model.fit(X_train, y_train)
-
- # 预测
- y_pred = model.predict(X_test)
-
- # 评估模型(此处省略了评估步骤的代码)
3.决策树算法(Decision Tree):决策树是一种用于预测分类或数值类型的机器学习算法。它通过树形结构来呈现数据特征的层次关系,进而对数据进行分类或预测。
决策树是一种树形结构,为人们提供决策依据,决策树可以用来回答yes和no问题,它通过树形结构将各种情况组合都表示出来,每个分支表示一次选择(选择yes还是no),直到所有选择都进行完毕,最终给出正确答案。
决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。在实际构造决策树时,通常要进行剪枝,这时为了处理由于数据中的噪声和离群点导致的过分拟合问题。剪枝有两种:
先剪枝——在构造过程中,当某个节点满足剪枝条件,则直接停止此分支的构造。
后剪枝——先构造完成完整的决策树,再通过某些条件遍历树进行剪枝。
易于理解和解释:决策树模型以树状图的形式呈现,非常直观,易于理解和解释。每个内部节点表示一个特征上的测试,每个分支代表一个测试输出,每个叶节点代表一个类别(对于分类问题)或值(对于回归问题)。
能够处理数值和分类数据:决策树能够处理数值型特征和分类型特征,不需要进行额外的特征缩放或转换。
对数据分布没有假设:决策树不依赖于数据的分布假设,例如线性关系或正态性。
能够处理非线性关系:与逻辑回归等线性模型不同,决策树可以学习特征之间的非线性关系。
易于实现和使用:决策树算法相对简单,易于编程实现,并且大多数机器学习库都提供了现成的实现。
鲁棒性强:决策树对缺失值不敏感,并且能够处理不相关的特征。
特征选择:决策树可以作为特征选择工具,通过选择最重要的特征来构建模型。
过拟合风险:如果树过于复杂,可能会导致过拟合。这通常通过剪枝(pruning)技术来避免,包括预剪枝和后剪枝。
对连续型变量处理不佳:决策树在处理连续型变量时,通常需要将其离散化,这可能会导致信息丢失。
对不平衡数据集敏感:如果数据集中某些类别的样本数量远多于其他类别,决策树可能会偏向于多数类,导致对少数类的预测不准确。
稳定性差:决策树算法对数据集的变化比较敏感,不同的划分方式可能会导致不同的树结构。这可以通过集成学习方法(如随机森林)来提高稳定性。
不适合处理具有大量特征的数据集:当特征数量很多时,决策树可能会变得非常复杂,难以理解和解释。此外,寻找最佳划分点也会变得更加耗时。
忽略特征之间的相关性:决策树在构建过程中,通常假设特征之间是独立的,但实际上特征之间可能存在相关性。这可能会导致决策树错过一些重要的信息。
案例实现:流失用户预测。
- from sklearn.model_selection import train_test_split
- from sklearn.tree import DecisionTreeClassifier
- from sklearn.datasets import load_iris
-
- # 加载鸢尾花数据集
- iris = load_iris()
- X = iris.data
- y = iris.target
-
- # 划分训练集和测试集
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
-
- # 创建并训练模型
- model = DecisionTreeClassifier()
- model.fit(X_train, y_train)
-
- # 预测
- y_pred = model.predict(X_test)
-
- # 评估模型(此处省略了评估步骤的代码)
4.随机森林算法(Random Forest):随机森林是一种用于预测分类或数值类型的机器学习算法。它通过结合多个决策树来提高模型的准确度和泛化性能。案例实现:信用评分。
高准确性:随机森林通常能够产生高准确度的预测结果,因为它通过集成多个决策树的预测结果来减少误差。
鲁棒性强:由于随机森林集成了多个决策树,每个决策树都在不同的数据子集和特征子集上进行训练,因此它对噪声和异常值具有较强的鲁棒性。
不容易过拟合:随机森林通过引入随机性(如随机选择特征进行划分)和集成多个决策树,降低了过拟合的风险。
能够处理大规模数据和高维数据:随机森林算法可以有效地处理大规模数据集和高维数据集,因为它可以并行化计算,并且可以通过随机选择特征来降低数据维度。
能够评估特征重要性:随机森林可以提供每个特征对模型预测结果的重要性评估,有助于理解数据和模型。
能够处理缺失值:随机森林算法能够处理数据中的缺失值,并在预测时有效地利用这些信息。
易于并行化:由于每个决策树的构建是独立的,因此随机森林算法易于并行化,可以充分利用多核处理器或分布式计算资源。
计算复杂度高:由于需要训练多个决策树模型,并且需要对每个模型进行预测,因此随机森林算法的计算复杂度较高。
需要大量内存:随机森林算法需要存储多个决策树模型,因此需要大量内存。
模型解释性较差:由于随机森林集成了多个决策树,因此其模型解释性相对较差,不容易直接理解单个特征对预测结果的影响。
对参数敏感:随机森林的性能受到参数(如决策树数量、特征子集大小等)的影响,需要仔细调整参数以获得最佳性能。
在某些场景下可能不如其他算法:在某些特定的数据集或任务上,其他算法(如深度学习、支持向量机等)可能比随机森林具有更好的性能。
- from sklearn.datasets import fetch_california_housing
- from sklearn.model_selection import train_test_split
- from sklearn.ensemble import RandomForestRegressor
-
- # 加载加州房价数据集
- california_housing = fetch_california_housing()
- X = california_housing.data
- y = california_housing.target
-
- # 划分训练集和测试集
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
-
- # 创建并训练随机森林回归器
- regr = RandomForestRegressor(n_estimators=100, random_state=42)
- regr.fit(X_train, y_train)
-
- # 预测
- y_pred = regr.predict(X_test)
-
- # 评估模型(省略了评估代码)
5.支持向量机算法(Support Vector Machine):支持向量机是一种用于预测分类或数值类型的机器学习算法。它通过将数据映射到高维空间并寻找最优分割超平面来对数据进行分类或预测。案例实现:手写数字识别。
- from sklearn import datasets
- from sklearn.model_selection import train_test_split
- from sklearn.preprocessing import StandardScaler
- from sklearn.svm import SVC
-
- # 加载手写数字数据集
- digits = datasets.load_digits()
- X, y = digits.data, digits.target
-
- # 数据标准化
- scaler = StandardScaler()
- X_scaled = scaler.fit_transform(X)
-
- # 划分训练集和测试集
- X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
-
- # 创建并训练SVM分类器
- clf = SVC(kernel='rbf', gamma=0.7, C=1.0)
- clf.fit(X_train, y_train)
-
- # 预测
- y_pred = clf.predict(X_test)
-
- # 评估模型(省略了评估代码)
6.朴素贝叶斯算法(Naive Bayes):朴素贝叶斯是一种用于预测分类类型的机器学习算法。它通过基于贝叶斯定理和特征条件独立假设对数据进行建模。案例实现:垃圾邮件分类。
朴素贝叶斯分类器基于贝叶斯定理及其假设(即特征之间是独立的,是不相互影响的),主要用来解决分类和回归问题。
1.具体应用有:
2.标记一个电子邮件为垃圾邮件或非垃圾邮件;
3.将新闻文章分为技术类、政治类或体育类;
4.检查一段文字表达积极的情绪,或消极的情绪;
5.用于人脸识别软件。
优点:
1.对大数量训练和查询时具有较高的速度。即使使用超大规模的训练集,针对每个项目通常也只会有相对较少的特征数,并且对项目的训练和分类也仅仅是特征概率的数学运算而已。
2.支持增量式运算。即可以实时的对新增的样本进行训练。
3.朴素贝叶斯对结果解释容易理解。
缺点:
由于使用了样本属性独立性的假设,所以如果样本属性有关联时其效果不好。
应用领域:
文本分类、欺诈检测中使用较多
学过概率的同学一定都知道贝叶斯定理,这个在250多年前发明的算法,在信息领域内有着无与伦比的地位。贝叶斯分类是一系列分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。朴素贝叶斯算法(Naive Bayesian) 是其中应用最为广泛的分类算法之一。朴素贝叶斯分类器基于一个简单的假定:给定目标值时属性之间相互条件独立。
- from sklearn.datasets import fetch_20newsgroups
- from sklearn.model_selection import train_test_split
- from sklearn.feature_extraction.text import CountVectorizer
- from sklearn.naive_bayes import MultinomialNB
-
- # 加载新闻组数据集(通常用于文本分类,但这里可以模拟垃圾邮件过滤)
- newsgroups_train = fetch_20newsgroups(subset='train')
- X_train, X_test, y_train, y_test = train_test_split(newsgroups_train.data, newsgroups_train.target, test_size=0.2, random_state=42)
-
- # 特征提取:将文本转换为词频向量
- vectorizer = CountVectorizer()
- X_train_counts = vectorizer.fit_transform(X_train)
- X_test_counts = vectorizer.transform(X_test)
-
- # 创建并训练朴素贝叶斯分类器
- clf = MultinomialNB()
- clf.fit(X_train_counts, y_train)
-
- # 预测
- y_pred = clf.predict(X_test_counts)
-
- # 评估模型(省略了评估代码)
7.K近邻算法(K-Nearest Neighbors):邻近算法,或者说K最近邻(KNN,K-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。KNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 KNN方法在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
主要应用领域是对未知事物的识别,即判断未知事物属于哪一类,判断思想是,基于欧几里得定理,判断未知事物的特征和哪一类已知事物的的特征最接近。如上图,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。由此也说明了KNN算法的结果很大程度取决于K的选择。
缺点
案例实现:鸢尾花分类。
- from sklearn.model_selection import train_test_split
- from sklearn.neighbors import KNeighborsClassifier
- from sklearn.datasets import load_iris
-
- # 加载鸢尾花数据集
- iris = load_iris()
- X = iris.data
- y = iris.target
-
- # 划分训练集和测试集
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
-
- # 创建并训练模型
- model = KNeighborsClassifier(n_neighbors=3)
- model.fit(X_train, y_train)
-
- # 预测
- y_pred = model.predict(X_test)
-
- # 评估模型(此处省略了评估步骤的代码)
8.神经网络算法(Neural Networks):神经网络是一种用于预测分类或数值类型的机器学习算法。它通过模拟人脑神经元的结构和功能来对数据进行建模。案例实现:手写数字识别。
- # 导入必要的库
- from keras.datasets import mnist
- from keras.models import Sequential
- from keras.layers import Dense, Dropout, Flatten
- from keras.layers import Conv2D, MaxPooling2D
- from keras.utils import to_categorical
-
- # 加载MNIST数据集
- (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
-
- # 数据预处理:归一化到0-1范围,并将标签转换为one-hot编码
- train_images = train_images / 255.0
- test_images = test_images / 255.0
- train_labels = to_categorical(train_labels)
- test_labels = to_categorical(test_labels)
-
- # 定义模型结构
- model = Sequential()
- model.add(Flatten(input_shape=(28, 28))) # 将28x28的图像展平为784个特征
- model.add(Dense(128, activation='relu')) # 添加一个隐藏层,包含128个神经元,使用ReLU激活函数
- model.add(Dropout(0.2)) # 添加dropout层以防止过拟合
- model.add(Dense(10, activation='softmax')) # 输出层,10个神经元对应10个数字类别,使用softmax激活函数
-
- # 编译模型
- model.compile(optimizer='adam',
- loss='categorical_crossentropy', # 使用交叉熵损失函数
- metrics=['accuracy']) # 监控准确率
-
- # 训练模型
- model.fit(train_images, train_labels, epochs=5, batch_size=64)
-
- # 评估模型
- test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
- print('\nTest accuracy:', test_acc)
-
- # 预测单个样本
- import numpy as np
- predictions = model.predict(np.array([test_images[0]]))
- print('Predicted:', np.argmax(predictions[0]))
9.PCA算法(Principal Component Analysis):PCA是一种用于降维的机器学习算法。它通过找到数据中变化最大的主成分来将数据从高维空间映射到低维空间。案例实现:手写数字识别。
降低数据维度:PCA可以有效地降低数据的维度,同时保留数据中的主要特征。这有助于减少计算成本,提高机器学习算法的效率。
去除噪声和冗余:通过减少不相关的或冗余的特征,PCA可以提高数据的信噪比,使模型更易于理解和解释。
可视化:当数据的维度降低到2维或3维时,PCA可以用于数据的可视化,帮助人们直观地理解数据的结构和分布。
特征选择:PCA提供了一种自动选择特征的方法,不需要人工进行特征选择。
无参数限制:PCA算法不需要像一些机器学习算法那样调整复杂的参数,使用起来相对简单。
信息损失:虽然PCA能够保留数据中的主要特征,但必然会损失一些信息。如果降维的维度过低,可能会丢失一些关键信息,导致模型性能下降。
对数据的假设:PCA假设数据是线性的,即数据的主要变化方向是沿着某些特定的线性方向。如果数据中存在非线性关系,PCA可能无法有效地提取这些特征。
对数据的敏感性:PCA对数据的缩放和中心化敏感。如果数据的尺度不同或者没有进行中心化处理,PCA的结果可能会受到影响。
解释性较差:PCA提取的主成分通常是原始特征的线性组合,这些组合可能难以直观地解释其实际意义。
容易受到异常值的影响:如果数据集中存在异常值,PCA的结果可能会受到较大影响,因为PCA是基于数据的协方差矩阵进行计算的。
非监督学习:PCA是一种无监督学习方法,它只关注数据的统计特性,而不考虑数据的标签或输出。因此,在某些需要利用标签信息的任务中,PCA可能不是最佳选择。
- # 导入必要的库
- from sklearn.decomposition import PCA
- from sklearn.datasets import load_iris
- from sklearn.preprocessing import StandardScaler
- from matplotlib import pyplot as plt
-
- # 加载鸢尾花数据集
- iris = load_iris()
- X = iris.data
- y = iris.target
-
- # 数据标准化(对于PCA很重要)
- scaler = StandardScaler()
- X_scaled = scaler.fit_transform(X)
-
- # 初始化PCA对象,n_components表示要保留的主成分数量
- pca = PCA(n_components=2)
-
- # 对数据进行PCA转换
- X_pca = pca.fit_transform(X_scaled)
-
- # 打印解释的主成分方差比例(即保留的信息量)
- print("Explained variance ratio:", pca.explained_variance_ratio_)
-
- # 可视化结果(仅适用于2D或3D数据)
- plt.figure(figsize=(8, 6))
- colors = ['navy', 'turquoise', 'darkorange']
- for c, i, target_name in zip(colors, [0, 1, 2], iris.target_names):
- plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1], c=c, label=target_name)
- plt.legend()
- plt.title('PCA of IRIS dataset')
- plt.xlabel('First principal component')
- plt.ylabel('Second principal component')
- plt.show()
10.聚类算法(Clustering):聚类算法就是将一堆数据进行处理,根据它们的相似性对数据进行聚类。聚类,就像回归一样,有时候人们描述的是一类问题,有时候描述的是一类算法。聚类算法通常按照中心点或者分层的方式对输入数据进行归并。所以的聚类算法都试图找到数据的内在结构,以便按照最大的共同点将数据进行归类。常见的聚类算法包括 k-Means算法以及期望最大化算法(Expectation Maximization, EM)。
聚类算法有很多种:中心聚类、关联聚类、密度聚类、概率聚类、降维、神经网络/深度学习。
案例实现:用户分群。
- from sklearn.cluster import KMeans
- from sklearn.datasets import make_blobs
- import matplotlib.pyplot as plt
-
- # 生成模拟数据
- X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
-
- # 创建KMeans实例并训练
- kmeans = KMeans(n_clusters=4)
- kmeans.fit(X)
-
- # 预测聚类
- y_kmeans = kmeans.predict(X)
-
- # 可视化结果
- plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
- centers = kmeans.cluster_centers_
- plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200, alpha=0.5);
- plt.show()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。