案例:数字识别器

学习⽬标

应⽤SVM算法实现数字识别器

1 案例背景介绍

MNIST是计算机视觉事实上的“hello world”数据集。⾃1999年发布以来,这⼀经典的⼿写图像数据集已成为分类算法基准测试的基础。随着新的机器学习技术的出现,MNIST仍然是研究⼈员和学习者的可靠资源。

本次案例中,我们的⽬标是从数万个⼿写图像的数据集中正确识别数字。

2 数据介绍

1> 数据⽂件train.csv和test.csv包含从0到9的⼿绘数字的灰度图像。

2> 每个图像的⾼度为28个像素,宽度为28个像素,总共为784个像素。

3> 每个像素具有与其相关联的单个像素值,指示该像素的亮度或暗度,较⾼的数字意味着较暗。该像素值是0到255之间的整数,包括0和255。

4> 训练数据集(train.csv)有785列。第⼀列称为“标签”,是⽤户绘制的数字。其余列包含关联图像的像素值。

5> 训练集中的每个像素列都具有像pixelx这样的名称

测试数据集(test.csv)与训练集相同,只是它不包含“标签”列。

3 案例实现

1】尝试使用5个不同的PCA的值(小数) 通过SVC模型 训练 得到不同的准确率

2】可视化

3】特征需要进行标准化处理 /255

"""""
学习⽬标
应⽤SVM算法实现数字识别器
1 案例背景介绍

MNIST是计算机视觉事实上的“hello world”数据集。⾃1999年发布以来,这⼀经典的⼿写图像数据集已成为分类算法基准测试的基础。随着新的机器学习技术的出现,MNIST仍然是研究⼈员和学习者的可靠资源。
本次案例中,我们的⽬标是从数万个⼿写图像的数据集中正确识别数字。

2 数据介绍
1> 数据⽂件train.csv和test.csv包含从0到9的⼿绘数字的灰度图像。
2> 每个图像的⾼度为28个像素,宽度为28个像素,总共为784个像素。
3> 每个像素具有与其相关联的单个像素值,指示该像素的亮度或暗度,较⾼的数字意味着较暗。该像素值是0到255之间的整数,包括0和255。
4> 训练数据集(train.csv)有785列。第⼀列称为“标签”,是⽤户绘制的数字。其余列包含关联图像的像素值。
5> 训练集中的每个像素列都具有像pixelx这样的名称
3 案例实现
1】尝试使用5个不同的PCA的值(小数) 通过SVC模型 训练 得到不同的准确率 
2】可视化
3】特征需要进行标准化处理 /255
"""""
from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from sklearn.preprocessing import StandardScaler
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

data=pd.read_csv("./train.csv")
print(data.head())
print(data.shape)
print(data.dtypes)

data_x=data.iloc[:,1:]
y=data.iloc[:,0]

transfer=StandardScaler()
data_x=transfer.fit_transform(data_x)
print(data_x)
plt.figure()
n_components=[0.4,0.5,0.6,0.7,0.8]
sc=[]
for i in n_components:
    transfer = PCA(n_components=i)
    x=transfer.fit_transform(data_x)
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)

    model = SVC(kernel="linear", C=1.0)
    model.fit(x_train, y_train)

    score=model.score(x_test, y_test)
    print(f"n_components={i}的准确率:", score)
    sc.append(score)
    # y_pred = model.predict(x_test)
    # print(accuracy_score(y_test, y_pred))

plt.plot(n_components,sc)
plt.xlabel("PCA值")
plt.ylabel("准确率")
plt.title("准确率随PAC变化")
plt.show()




乳腺癌分类预测

项目背景

你在一家医疗数据分析公司工作,需要基于威斯康星州乳腺癌诊断数据集建立一个SVM分类模型,帮助医生预测肿瘤是良性还是恶性。数据集包含肿瘤的各种特征如半径、纹理、周长等。

数据集

威斯康星州乳腺癌诊断数据集

题目要求

  1. 使用Pandas加载数据集并进行探索性数据分析(EDA)
  2. 使用Numpy处理缺失值
  3. 使用matplotlib绘制特征分布图
  4. 构建SVM分类模型并评估其性能
  5. 绘制决策边界可视化(选择两个主要特征)
"""""
项目背景
你在一家医疗数据分析公司工作,需要基于威斯康星州乳腺癌诊断数据集建立一个SVM分类模型,帮助医生预测肿瘤是良性还是恶性。数据集包含肿瘤的各种特征如半径、纹理、周长等。
数据集
威斯康星州乳腺癌诊断数据集
题目要求
1.使用Pandas加载数据集并进行探索性数据分析(EDA)
2.使用Numpy处理缺失值
3.使用matplotlib绘制特征分布图
4.构建SVM分类模型并评估其性能
5.绘制决策边界可视化(选择两个主要特征)
"""""

from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from sklearn.preprocessing import StandardScaler
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

data=pd.read_csv("./data.csv")
print(data)
print(data.shape)
print(data.dtypes)
print(data.isnull().sum())

data = data.drop('id', axis=1)
data['diagnosis'] = data['diagnosis'].map({'M':1, 'B':0})

# 诊断结果分布
plt.figure(figsize=(8, 5))
sns.countplot(x='diagnosis', data=data)
plt.title('诊断结果分布 (0=良性, 1=恶性)')
plt.show()

# 特征分布
features = data.columns[1:11]
plt.figure(figsize=(15, 15))
for i, feature in enumerate(features):
    plt.subplot(5, 2, i+1)
    sns.histplot(data[feature], bins=30, kde=True)
    plt.title(feature)
plt.tight_layout()
plt.show()

# 准备数据
x=data.iloc[:,1:31]
y=data["diagnosis"]
print(x)

# 标准化
transfer=StandardScaler()
x=transfer.fit_transform(x)

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)

svm_model = SVC(kernel='rbf', C=10, gamma='scale', random_state=42)
svm_model.fit(x_train, y_train)

print("准确率:",svm_model.score(x_test,y_test))

# PCA降维
pca = PCA(n_components=2)
x_pca = pca.fit_transform(x)

x_train_pca, x_test_pca, y_train_pca, y_test_pca = train_test_split(x_pca, y, test_size=0.3, random_state=42)

svm_model_pca = SVC(kernel='rbf', C=1.0, gamma='scale', random_state=42)
svm_model_pca.fit(x_train_pca, y_train_pca)

# 创建网格用于绘制决策边界
x_min, x_max = x_pca[:, 0].min() - 1, x_pca[:, 0].max() + 1
y_min, y_max = x_pca[:, 1].min() - 1, x_pca[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
                     np.arange(y_min, y_max, 0.02))

# 预测每个网格点的类别
Z = svm_model_pca.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.figure()
plt.contourf(xx, yy, Z)
plt.scatter(x_pca[:, 0], x_pca[:, 1], c=y, edgecolors='k')
plt.xlabel('第一主成分')
plt.ylabel('第二主成分')
plt.title('决策边界')
plt.show()





Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐