一、实验目的
可以应用于各种分类问题的解决,具体场景包括但不限于:
(1)医学诊断:例如基于肿瘤细胞的特征(大小、形状等)来判断是否为良性或恶性肿瘤。
(2)金融风控:例如基于客户的个人信息(收入、信用记录等)预测其是否有违约风险。
(3)图像识别:例如基于图像中的像素点特征来识别图像中的物体属于哪一类别。
(4)情感分析:例如基于文本中的单词、情感词等特征来判断文本中表达的情感是正面还是负主要通过感知机模型对鸢尾花数据集进行分类,该数据集是一个非常经典的分类问题
2.原因:
主要通过感知机模型对鸢尾花数据集进行分类,该数据集是一个非常经典的分类问题
三、实验结果及分析
1、解析实验过程、分析实验结果
问题:
(1)超参数设置问题:在实验中选择合适的超参数对模型性能至关重要。如果超参 数设置不当,可能会导致模型过拟合或欠拟合,从而影响预测结果的准确性。学习到的
经验是需要通过交叉验证等方法来调优超参数,以找到最优的超参数组合。
(2)数据质量问题:实验中遇到的数据质量问题可能包括缺失值、异常值或数据不平 衡等。学习到的经验是在进行数据预处理时需要仔细检查数据质量, 并采取相应的处理 措施,以确保数据的准确性和完整性。
(3)模型选择问题:在实验中选择合适的模型对于实现准确的预测结果至关重要。学 习到的经验是需要根据数据的特点和预测目标来选择合适的模型,同时进行模型评估和 比较,以确保选择的模型能够很好地拟合数据并具有良好的泛化能力。
2.实验结果反映的现实问题:
(1)模型适用性:
感知机是一种线性分类器,它本质上只能解决线性可分的问题。鸢尾花数据集中存在三个类别,而感知机只能处理二分类问题,因此需要进行特别处理(如将多分类问题拆解为多个二分类问题)。结果来看,准确率较低,表明感知机可能并不适用于处理鸢尾花数据集的三分类问题。
(2)算法局限性:
感知机不适用于非线性可分的数据集。鸢尾花数据集并不是完全线性可分的,这导致感知机模型的表现较差。更复杂的模型如支持向量机(SVM)、决策树、随机森林等可以更好地处理复杂的模式识别问题.
(3)数据标准化的重要性:
数据标准化对感知机的训练过程有很大影响。在没有标准化之前,各特征的尺度不同可能会导致权重更新时步长变化过大,影响模型稳定性。
2、附源代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 获取两个特征值
feature1 = 0 # 选择第一个特征列
feature2 = 1 # 选择第二个特征列
# 获取类别标签
target_names = iris.target_names
plt.figure(figsize=(8, 6))
for target in range(len(target_names)):
X_target = X[y == target]
plt.scatter(X_target[:, feature1], X_target[:, feature2], label=target_names[target])
plt.xlabel(iris.feature_names[feature1])
plt.ylabel(iris.feature_names[feature2])
plt.title('data')
plt.legend()
plt.show()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.fit_transform(X_test)
# 定义感知机类
class Perceptron(object):
def __init__(self, learning_rate=0.01, n_iterations=10):
self.learning_rate = learning_rate
self.n_iterations = n_iterations
def fit(self, X, y):
self.weights = np.zeros(X.shape[1])
self.bias = 0
for _ in range(self.n_iterations):
for xi, target in zip(X, y):
prediction = self.predict(xi)
update = self.learning_rate * (target - prediction)
self.weights += update * xi
self.bias += update
def predict(self, X):
return np.where(np.dot(X, self.weights) + self.bias > 0, 1, -1)
# 创建感知机模型并训练
perceptron = Perceptron(learning_rate=0.01, n_iterations=10000)
perceptron.fit(X_train, y_train)
y_pred = perceptron.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"准确率: {accuracy}")
结果展示: