目录
- 综述
- 逻辑回归 (Logistic Regression)
- 决策树 (Decision Tree)
- 支持向量机 (Support Vector Machine, SVM)
- 朴素贝叶斯分类器 (Naive Bayes Classifier)
- k-近邻算法 (k-Nearest Neighbor, k-NN)
- 随机森林 (Random Forest)
综述
- 逻辑回归 (Logistic Regression)
- 决策树 (Decision Tree)
- 支持向量机 (Support Vector Machine, SVM)
- 朴素贝叶斯分类器 (Naive Bayes Classifier)
- k-近邻算法 (k-Nearest Neighbor, k-NN)
- 随机森林 (Random Forest)
逻辑回归 (Logistic Regression)
python脚本实现
- 使用逻辑回归算法对 iris 数据集进行分类,并计算了准确率、精确率、召回率和 F1 值等评估指标
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
if __name__ == '__main__':
# 加载鸢尾花数据集
iris = load_iris()
X, y = iris.data, iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 初始化逻辑回归分类器
clf = LogisticRegression()
# 训练模型
clf.fit(X_train, y_train)
# 预测测试集的标签
y_pred = clf.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
# 计算精确率
precision = precision_score(y_test, y_pred, average='weighted')
# 计算召回率
recall = recall_score(y_test, y_pred, average='weighted')
# 计算F1值
f1 = f1_score(y_test, y_pred, average='weighted')
# 输出评估指标
print("Accuracy:", accuracy)
print("Precision:", precision)
print("Recall:", recall)
print("F1 score:", f1)
原理
- 逻辑回归是一种广泛使用的二分类算法。其基本原理是在给定一些训练数据的情况下,通过拟合一个线性分类器的方法来对新的输入样本进行分类,逻辑回归的目标是找到一组合适的权重向量w,使得该模型在训练数据上的分类效果最好
决策树 (Decision Tree)
python脚本实现
- product.csv包含两个特征(Product ID和Product Type)和一个标签(Quality),标签用于表示产品是否合格(合格为1,不合格为0)。我们可以使用决策树模型来预测新产品是否合格
Product ID,Product Type,Quality
1,A,1
2,B,1
3,C,0
4,D,0
5,E,1
6,F,0
7,G,1
8,H,1
9,I,1
10,J,0
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
if __name__ == '__main__':
# Load data
data = pd.read_csv("C:/Users/lingq1/Desktop/product.csv")
# 将特征和标签拆分
X = data.drop(columns=['Quality'])
y = data['Quality']
# 将特征进行独热编码
X = pd.get_dummies(X)
# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建决策树分类器
clf = DecisionTreeClassifier()
# 训练模型
clf.fit(X_train, y_train)
# 预测测试集结果
y_pred = clf.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy:', accuracy)
原理
- 选择一个特征作为根节点,并根据该特征将数据集分为不同的子集
- 对每个子集递归执行步骤1,直到子集中的样本都属于同一类别或特征已经用完为止
- 为每个子集分配一个标签,使得对于一个新的数据点,通过遍历决策树可以到达其所属的子集
- 在决策树的构建过程中,如何选择特征以及如何划分数据集是关键的问题。通常,使用信息增益或基尼不纯度等指标来衡量不同特征的重要性,选择最重要的特征进行划分。同时,为了避免过拟合,可以通过剪枝等方法来对决策树进行优化
支持向量机 (Support Vector Machine, SVM)
python实现
- SVM算法的优点在于能够处理高维数据,对于非线性分类问题有很好的表现,缺点是对于数据量非常大的问题计算开销较大
- 支持向量机分类器代码加载了鸢尾花数据集,将数据拆分为训练和测试集,使用线性内核训练了一个SVM分类器,并使用测试数据计算了分类器的准确性
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
if __name__ == '__main__':
# 加载数据
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 分割数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
# 训练SVM分类器
clf = SVC(kernel='linear', C=1.0, random_state=0)
clf.fit(X_train, y_train)
# 测试SVM分类器
y_pred = clf.predict(X_test)
acc = accuracy_score(y_test, y_pred)
# 打印结果
print('Accuracy:', acc)
朴素贝叶斯分类器 (Naive Bayes Classifier)
python代码实现
- 代码中使用 scikit-learn 库中的 GaussianNB 类实现朴素贝叶斯分类器。在这个示例中,我们使用了 iris 数据集并将其分成了训练集和测试集。在训练集上拟合了分类器之后,我们在测试集上测试了分类器,并计算了分类器的准确率
from sklearn.datasets import load_iris
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
if __name__ == '__main__':
# 加载数据
iris = load_iris()
# 创建朴素贝叶斯分类器
clf = GaussianNB()
# 将数据集分成训练集和测试集
split_index = int(len(iris.data) * 0.8)
train_data = iris.data[:split_index]
train_target = iris.target[:split_index]
test_data = iris.data[split_index:]
test_target = iris.target[split_index:]
# 在训练集上训练分类器
clf.fit(train_data, train_target)
# 在测试集上测试分类器
predicted_target = clf.predict(test_data)
# 计算分类器的准确率
accuracy = accuracy_score(test_target, predicted_target)
print("Accuracy:", accuracy)
原理
- 对于给定的文本,将其转化为特征向量表示。
- 统计训练数据集中各类别的概率
- 对于每个特征维度,计算在给定类别下该特征的条件概率。
- 利用贝叶斯公式计算文本属于各类别的概率,并选取概率最大的类别作为该文本的分类
- 朴素贝叶斯分类器(Naive Bayes Classifier)是一种基于贝叶斯定理的简单概率分类器,常用于文本分类、垃圾邮件过滤等领域。贝叶斯定理描述了在已知某个事件发生的前提下,另一个事件发生的概率,即后验概率。在分类问题中,朴素贝叶斯分类器通过计算某个文本属于某一类别的概率,然后选取概率最大的类别作为该文本的分类
- 在实际应用中,朴素贝叶斯分类器需要解决的主要问题是特征的选取和文本表示方法的选择。此外,朴素贝叶斯分类器对于噪声和冗余特征的处理也很重要,这方面的技术通常包括特征选择、特征降维等
k-近邻算法 (k-Nearest Neighbor, k-NN)
python实现
- 代码使用的是欧几里得距离作为距离度量,可以根据具体的应用场景选择其他的距离度量方法
from collections import Counter
import numpy as np
def euclidean_distance(x1, x2):
"""计算两个向量之间的欧几里得距离"""
return np.sqrt(np.sum((x1 - x2) ** 2))
class KNN:
def __init__(self, k=3):
self.k = k
def fit(self, X, y):
"""训练模型"""
self.X_train = X
self.y_train = y
def predict(self, X):
"""预测标签"""
y_pred = [self._predict(x) for x in X]
return np.array(y_pred)
def _predict(self, x):
"""预测单个数据点的标签"""
# 计算样本与训练数据集中所有样本之间的距离
distances = [euclidean_distance(x, x_train) for x_train in self.X_train]
# 找出距离最近的k个样本
k_indices = np.argsort(distances)[:self.k]
# 找出这k个样本的标签
k_nearest_labels = [self.y_train[i] for i in k_indices]
# 对这k个样本的标签进行投票,返回得票最多的标签
most_common = Counter(k_nearest_labels).most_common(1)
return most_common[0][0]
if __name__ == '__main__':
# 创建一个简单的数据集
X = np.array([[1, 2], [1.5, 1.8], [5, 8], [8, 8], [1, 0.6], [9, 11]])
y = np.array([0, 0, 1, 1, 0, 1])
# 创建KNN分类器,k=3
clf = KNN(k=3)
# 训练模型
clf.fit(X, y)
# 预测新的数据点
X_test = np.array([[3, 4], [4, 5], [8, 9], [0, 0]])
y_pred = clf.predict(X_test)
print(y_pred)
随机森林 (Random Forest)
python实现
- stock_data.csv, 基于python实现的随机森林算法预测股票走向,date 列表示日期,open 表示开盘价,high 表示最高价,low 表示最低价,close 表示收盘价,label 表示涨跌情况,0 表示跌,1 表示涨
date,open,high,low,close,label
2022-02-11,100,110,99,105,1
2022-02-10,98,105,97,100,1
2022-02-09,90,99,88,95,0
2022-02-08,85,92,80,88,0
2022-02-07,87,95,85,90,0
2022-02-04,90,92,80,85,0
2022-02-03,95,100,92,93,1
2022-02-02,92,98,88,95,1
2022-02-01,88,92,85,90,0
2022-01-31,92,95,87,88,0
2022-01-28,95,97,90,93,1
2022-01-27,93,96,90,92,1
2022-01-26,90,93,85,88,0
2022-01-25,88,90,82,85,0
2022-01-24,80,90,75,88,1
2022-01-21,75,80,72,78,0
2022-01-20,70,78,68,76,0
2022-01-19,68,72,65,70,0
2022-01-18,72,74,68,70,0
2022-01-17,75,78,70,72,1
2022-01-14,78,80,75,77,1
2022-01-13,80,85,75,78,1
2022-01-12,85,90,80,82,1
2022-01-11,80,88,78,85,1
2022-01-10,75,82,70,80,1
- python实现demo, 开始之前需要先安装pandas和sklearn,随机森林提供了多维度的决策树
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from datetime import datetime
if __name__ == '__main__':
# 加载数据集, ****需要替换成你自己的path
data = pd.read_csv('*****/stock_data.csv')
# 转换日期格式为 Unix 时间戳
data['date'] = pd.to_datetime(data['date'])
data['date'] = data['date'].apply(lambda x: datetime.timestamp(x))
# 划分特征和标签
X = data.drop('label', axis=1)
y = data['label']
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 训练随机森林模型
rf = RandomForestClassifier(n_estimators=100)
rf.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = rf.predict(X_test)
# 输出准确率
accuracy = rf.score(X_test, y_test)
print(f"Accuracy: {accuracy}")
- 代码中,使用Pandas库的read_csv()函数加载股票数据集。然后,将数据集分成 X 和 y 两部分,其中 X 包含了除了 label 以外的所有特征,y 包含了labe 列的数据。接着,使用train_test_split()函数将数据集划分为训练集和测试集。然后,使用RandomForestClassifier类来构建随机森林模型,并使用fit()方法对模型进行训练。接着,使用predict()方法对测试集进行预测。最后,使用accuracy_score()函数计算预测准确率
原理
- 从原始数据集中随机抽取一部分样本,构造一个子数据集,用于训练一个决策树
- 重复上述步骤,构造多个子数据集,并训练多个决策树。
- 当需要对新数据进行预测时,将新数据输入每个决策树,得到多个预测结果。对于分类问题,可以使用投票法确定最终分类结果;对于回归问题,可以使用平均值确定最终预测结果
参考文章
网友评论