总代码:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
# 读取本地数据集
data = pd.read_csv('data.csv')
datas = np.array(data)
x = np.array(data[['radius_mean','texture_mean']])
data['diagnosis'] = data['diagnosis'].map({'M': 1, 'B': 0})
y = np.array(data['diagnosis'])
#拆分训练集与测试集
X_train,X_test,y_train,y_test = train_test_split(x, y,test_size = 0.2, random_state = 82)
#绘制分类边界线
l,r = x[:,0].min() -1, x[:,0].max() + 1
b,t = x[:,1].min() -1, x[:,1].max() + 1
n = 500 #分界线的光滑程度
#从坐标向量中返回坐标矩阵
grid_x,grid_y = np.meshgrid(np.linspace(1,r,n), np.linspace(b, t,n))
#把 grid_x 与 grid_t 押平了组成模型的输入,预测输出
# ravel()方法将数组维度拉成一维数组
mesh_x = np.column_stack((grid_x.ravel(),grid_y.ravel()))
# In[1]
#基于线性函数的 svm 绘制分类边界
from sklearn.svm import SVC #支持向量机做分类 监督学习
model = SVC(kernel = 'linear',random_state=42)
model.fit(X_train,y_train)
#模型预测准确率
y_pred1 = model.predict(X_test)
a1 = accuracy_score(y_pred1, y_test)
print("支持向量机预测精准度: a1= ", a1)
pred_mesh_y = model.predict(mesh_x)
grid_z = pred_mesh_y.reshape(grid_x.shape)
#绘制这些点
plt.pcolormesh(grid_x, grid_y,grid_z,label = 'dff',cmap = 'gray')
plt.scatter(x[y == 0,0], x[y == 0,1], s = 30, c ='r', label = '良性乳腺癌')
plt.scatter(x[y == 1,0], x[y == 1,1], s = 30, c = 'g', label = '恶性乳腺癌')
plt.title('良恶性乳腺癌-支持向量机',fontsize = 16)
plt.xlabel('radius_mean', fontsize = 12)
plt.ylabel('texture_mean', fontsize = 12)
plt.xlim(l, r)
plt.ylim(b, t)
plt.legend()
plt.show()
# In[1]
#引入高斯函数,高斯朴素叶贝斯做分类 监督学习
from sklearn.naive_bayes import GaussianNB
#实例化
clf = GaussianNB(var_smoothing=0.1)
#训练数据 fit相当于train
clf.fit(X_train,y_train)
#输出单个预测结果
pred = clf.predict(X_test)
#精确度
from sklearn.metrics import accuracy_score
a2 = accuracy_score(pred, y_test)
print(f'贝叶斯分类器预测精确度:a2= {a2}')
pred_mesh_y = clf.predict(mesh_x)
grid_z = pred_mesh_y.reshape(grid_x.shape)
#绘制这些点
plt.pcolormesh(grid_x, grid_y,grid_z,label = 'dff',cmap = 'gray')
plt.scatter(x[y == 0,0], x[y == 0,1], s = 30, c ='r', label = '良性乳腺癌')
plt.scatter(x[y == 1,0], x[y == 1,1], s = 30, c = 'g', label = '恶性乳腺癌')
plt.title('良恶性乳腺癌-贝叶斯',fontsize = 16)
plt.xlabel('radius_mean', fontsize = 12)
plt.ylabel('texture_mean', fontsize = 12)
plt.xlim(l, r)
plt.ylim(b, t)
plt.legend()
plt.show()
# In[1]
from sklearn.tree import DecisionTreeClassifier #决策树做分类,监督学习
from matplotlib.colors import ListedColormap #是一个特殊的颜色映射类,允许你从一组预定义的颜色列表中创建一个颜色映射。
from sklearn import tree
#创建决策树算法对象
tree_clf=DecisionTreeClassifier(max_depth=2,random_state=42)
#创建决策树
tree_clf.fit(X_train,y_train)
#绘制决策树结构
tree.plot_tree(tree_clf,filled=True)
from sklearn.tree import export_text
feature_namess = ['radius_mean','texture_mean']
r=export_text(tree_clf,feature_names=feature_namess)
print(r)
l,r = x[:,0].min() -1, x[:,0].max() + 1
b,t = x[:,1].min() -1, x[:,1].max() + 1
n=500 #线光滑程度
#定义绘制决策边界的函数
def plo(clf,x,y,axes=[l,r,b,t],
datas=True,
legend=False,
plot_training=True):
x1s=np.linspace(axes[0], axes[1],100)
x2s=np.linspace(axes[2], axes[3],100)
x1,x2=np.meshgrid(x1s, x2s)
X_new=np.c_[x1.ravel(),x2.ravel()]
y_pred=clf.predict(X_new).reshape(x1.shape)
custom_cmap=ListedColormap(['#a0faa0','#9898ff'])
plt.contourf(x1, x2,y_pred,alpha=0.3,cmap=custom_cmap)
if not datas:
custom_cmap2=ListedColormap(['#a0faa0','#9898ff'])
plt.contour(x1, x2,y_pred,cmap=custom_cmap2,alpha=0.8)
if plot_training:
plt.plot(x[:,0][y==0],x[:,1][y==0],"yo",label="良性乳腺癌")
plt.plot(x[:,0][y==1],x[:,1][y==1],"bs",label="恶性乳腺癌")
plt.axis(axes)
if datas:
plt.xlabel("radius_mean",fontsize=14)
plt.ylabel("texture_mean",fontsize=14)
else:
plt.xlabel(r"radius_mean",fontsize=14)
plt.ylabel(r"texture_mean",fontsize=14)
if legend:
plt.legend(loc=0,fontsize=14)
tree_clf1=DecisionTreeClassifier(random_state=42)#没有做剪枝处理 会出现过拟合
#减少过拟合
tree_clf2=DecisionTreeClassifier(min_samples_leaf=4,random_state=42)#做剪枝处理
tree_clf1.fit(X_train,y_train)
tree_clf2.fit(X_train,y_train)
plt.figure(figsize=(12,4))
plt.subplot(121) #第二左边张图形
plo(tree_clf1,x,y,axes=[l,r,b,t],datas=False)
plt.title('剪枝前良恶性乳腺癌-决策树算法',fontsize = 16)
plt.legend()
plt.subplot(122) #第二右边张图形
plo(tree_clf2,x,y,axes=[l,r,b,t],datas=False)
plt.title('剪枝后良恶性乳腺癌-决策树算法',fontsize = 16)
plt.legend()
plt.show()
print('\n')
#模型准确率
abb1 = tree_clf.score(X_test, y_test)
abb2_1 = tree_clf1.score(X_test, y_test)
abb2_2 = tree_clf2.score(X_test, y_test)
print('第一张图形决策树算法得分:abb1=',abb1)
print('第二张图形左边决策树算法得分:abb2_1=',abb2_1)
print('第二张图形右边决策树算法得分:abb2_2=',abb2_2)
# In[1]
print('\n')
print("-------模型精准度对比--------")
data = {
'算法': ["支持向量机", "贝叶斯分类器","决策树1", "决策树2","决策树3"],
'模型得分': [a1, a2, abb1, abb2_1,abb2_2]
}
df = pd.DataFrame(data)
sorted_df = df.sort_values(by='模型得分',ascending=False)
# 打印排序后的DataFrame
print(sorted_df)
《机器学习项目实践》实验报告
专业班级: 人工智能2303
学 号: 23055090355
姓 名: 刘嘉成
指导教师: 黄志伟
实验名称:
svm支持向量机、高斯朴素叶贝斯和决策树对威斯康星州乳腺癌(诊断)数据集分析实验
实验内容:(包括对数据集的描述)
- 用三种算法对威斯康星州乳腺癌(诊断)数据集中的'radius_mean','texture_mean'两个特征进行模型训练获得模型精准度得分以及分别可视化良恶性分布图形。
- 通过各算法的参数优化得到的模型精准度得分进行比较分析,确定哪一个算法更适合做'radius_mean','texture_mean'两个特征的实验。
- 通过对比各算法的可视化图形可知什么模型算法更好。
四、数据集的描述:
1.总样本实例数:569
2.属性数量:32(ID、诊断、30个实值输入特征如下)
3. 诊断(M=恶性,B=良性)
4.分类分布:良性357种,恶性212种
实验方法:
- 支持向量机 import sklearn.svm as svm
- 贝叶斯分类器 from sklearn.naive_bayes import GaussianNB
- 决策树算法 from sklearn.tree import DecisionTreeClassifier
- 模块pandas读取数据、train_test_split 分割训练集和测试集、accuracy_score 计算预测精准度、matplotlib.pyplot图形可视化、numpy数据处理转化。
实验过程:(加上源代码)
- 导入公共模块和显示中文模块
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文
- 加载公共数据集,用pandas导入数据,并且用numpy转化数组。取'radius_mean','texture_mean'特征经行实验,并且将数据集中的M、B标签替换为1和0。
# 读取本地数据集 data = pd.read_csv('data.csv') datas = np.array(data) x = np.array(data[['radius_mean','texture_mean']]) data['diagnosis'] = data['diagnosis'].map({'M': 1, 'B': 0}) y = np.array(data['diagnosis'])
- 拆分训练集与测试集
#拆分训练集与测试集 X_train,X_test,y_train,y_test = train_test_split(x, y,test_size = 0.2, random_state = 82)
- 加载公共'radius_mean','texture_mean'特征中的最大值和最小值范围加减1,同时也是为了后面可视化图形的分割线,并且设置分割线的光滑程度为n=500
#绘制分类边界线
l,r = x[:,0].min() -1, x[:,0].max() + 1
b,t = x[:,1].min() -1, x[:,1].max() + 1
n = 500 #分界线的光滑程度
#从坐标向量中返回坐标矩阵
grid_x,grid_y = np.meshgrid(np.linspace(1,r,n), np.linspace(b, t,n))
#把 grid_x 与 grid_t 押平了组成模型的输入,预测输出
# ravel()方法将数组维度拉成一维数组
mesh_x = np.column_stack((grid_x.ravel(),grid_y.ravel()))
- 支持向量机
- 导入模型算法
- 模型训练
- 模型预测
- 可视化图形
#基于线性函数的 svm 绘制分类边界
from sklearn.svm import SVC #支持向量机做分类 监督学习
model = SVC(kernel = 'linear',random_state=42)
model.fit(X_train,y_train)
#模型预测准确率
y_pred1 = model.predict(X_test)
a1 = accuracy_score(y_pred1, y_test)
print("支持向量机预测精准度: a1= ", a1)
pred_mesh_y = model.predict(mesh_x)
grid_z = pred_mesh_y.reshape(grid_x.shape)
#绘制这些点
plt.pcolormesh(grid_x, grid_y,grid_z,label = 'dff',cmap = 'gray')
plt.scatter(x[y == 0,0], x[y == 0,1], s = 30, c ='r', label = '良性乳腺癌')
plt.scatter(x[y == 1,0], x[y == 1,1], s = 30, c = 'g', label = '恶性乳腺癌')
plt.title('良恶性乳腺癌-支持向量机',fontsize = 16)
plt.xlabel('radius_mean', fontsize = 12)
plt.ylabel('texture_mean', fontsize = 12)
plt.xlim(l, r)
plt.ylim(b, t)
plt.legend()
plt.show()
- 高斯朴素叶贝斯
1、导入模型算法
2、模型训练
3、模型预测
4、可视化图形
#引入高斯函数,高斯朴素叶贝斯做分类 监督学习
from sklearn.naive_bayes import GaussianNB
#实例化
clf = GaussianNB(var_smoothing=0.1)
#训练数据 fit相当于train
clf.fit(X_train,y_train)
#输出单个预测结果
pred = clf.predict(X_test)
#精确度
from sklearn.metrics import accuracy_score
a2 = accuracy_score(pred, y_test)
print(f'贝叶斯分类器预测精确度:a2= {a2}')
pred_mesh_y = clf.predict(mesh_x)
grid_z = pred_mesh_y.reshape(grid_x.shape)
#绘制这些点
plt.pcolormesh(grid_x, grid_y,grid_z,label = 'dff',cmap = 'gray')
plt.scatter(x[y == 0,0], x[y == 0,1], s = 30, c ='r', label = '良性乳腺癌')
plt.scatter(x[y == 1,0], x[y == 1,1], s = 30, c = 'g', label = '恶性乳腺癌')
plt.title('良恶性乳腺癌-贝叶斯',fontsize = 16)
plt.xlabel('radius_mean', fontsize = 12)
plt.ylabel('texture_mean', fontsize = 12)
plt.xlim(l, r)
plt.ylim(b, t)
plt.legend()
plt.show()
- 决策树
1、导入模型算法
2、模型训练(1,2,3)
3、模型预测(1,2,3)
4、定义绘制决策边界的函数
5、可视化图形(1,2,3)
from sklearn.tree import DecisionTreeClassifier #决策树做分类,监督学习
from matplotlib.colors import ListedColormap #是一个特殊的颜色映射类,允许你从一组预定义的颜色列表中创建一个颜色映射。
from sklearn import tree
#创建决策树算法对象
tree_clf=DecisionTreeClassifier(max_depth=2,random_state=42)
#创建决策树
tree_clf.fit(X_train,y_train)
#绘制决策树结构
tree.plot_tree(tree_clf,filled=True)
from sklearn.tree import export_text
feature_namess = ['radius_mean','texture_mean']
r=export_text(tree_clf,feature_names=feature_namess)
print(r)
l,r = x[:,0].min() -1, x[:,0].max() + 1
b,t = x[:,1].min() -1, x[:,1].max() + 1
n=500 #线光滑程度
#定义绘制决策边界的函数
def plo(clf,x,y,axes=[l,r,b,t],
datas=True,
legend=False,
plot_training=True):
x1s=np.linspace(axes[0], axes[1],100)
x2s=np.linspace(axes[2], axes[3],100)
x1,x2=np.meshgrid(x1s, x2s)
X_new=np.c_[x1.ravel(),x2.ravel()]
y_pred=clf.predict(X_new).reshape(x1.shape)
custom_cmap=ListedColormap(['#a0faa0','#9898ff'])
plt.contourf(x1, x2,y_pred,alpha=0.3,cmap=custom_cmap)
if not datas:
custom_cmap2=ListedColormap(['#a0faa0','#9898ff'])
plt.contour(x1, x2,y_pred,cmap=custom_cmap2,alpha=0.8)
if plot_training:
plt.plot(x[:,0][y==0],x[:,1][y==0],"yo",label="良性乳腺癌")
plt.plot(x[:,0][y==1],x[:,1][y==1],"bs",label="恶性乳腺癌")
plt.axis(axes)
if datas:
plt.xlabel("radius_mean",fontsize=14)
plt.ylabel("texture_mean",fontsize=14)
else:
plt.xlabel(r"radius_mean",fontsize=14)
plt.ylabel(r"texture_mean",fontsize=14)
if legend:
plt.legend(loc=0,fontsize=14)
tree_clf1=DecisionTreeClassifier(random_state=42)#没有做剪枝处理 会出现过拟合
#减少过拟合
tree_clf2=DecisionTreeClassifier(min_samples_leaf=4,random_state=42)#做剪枝处理
tree_clf1.fit(X_train,y_train)
tree_clf2.fit(X_train,y_train)
plt.figure(figsize=(12,4))
plt.subplot(121) #第二左边张图形
plo(tree_clf1,x,y,axes=[l,r,b,t],datas=False)
plt.title('剪枝前良恶性乳腺癌-决策树算法',fontsize = 16)
plt.legend()
plt.subplot(122) #第二右边张图形
plo(tree_clf2,x,y,axes=[l,r,b,t],datas=False)
plt.title('剪枝后良恶性乳腺癌-决策树算法',fontsize = 16)
plt.legend()
plt.show()
print('\n')
#模型准确率
abb1 = tree_clf.score(X_test, y_test)
abb2_1 = tree_clf1.score(X_test, y_test)
abb2_2 = tree_clf2.score(X_test, y_test)
print('第一张图形决策树算法得分:abb1=',abb1)
print('第二张图形左边决策树算法得分:abb2_1=',abb2_1)
print('第二张图形右边决策树算法得分:abb2_2=',abb2_2)
- 模型精准度比较大小
print("-------模型精准度对比--------")
data = {
'算法': ["支持向量机", "贝叶斯分类器","决策树1", "决策树2","决策树3"],
'模型得分': [a1, a2, abb1, abb2_1,abb2_2]
}
df = pd.DataFrame(data)
sorted_df = df.sort_values(by='模型得分',ascending=False)
# 打印排序后的DataFrame
print(sorted_df)
-------模型精准度对比--------
算法 模型得分
0 支持向量机 0.921053
1 贝叶斯分类器 0.912281
2 决策树1 0.912281
4 决策树3 0.859649
3 决策树2 0.815789
实验结果与分析:
同过三种算法对威斯康星州乳腺癌(诊断)数据集中的'radius_mean','texture_mean'两个特征进行实验。
得到的结果如下:
1
2-3
算法精准度排序为:
-------模型精准度对比--------
算法 模型得分
0 支持向量机 0.921053
1 贝叶斯分类器 0.912281
2 决策树1 0.912281
4 决策树3 0.859649
3 决策树2 0.815789
总代码链接:
分析:
- 三种算法可视化图形都能较好的区分开良性肿瘤和恶性肿瘤。
- 三种算法的模型精准度都达到了0.8以上其中支持向量机达到了0.92。效果都较好,其中支持向量机效果相比其他算法是表现最好的。
- 总而言之svm支持向量机、高斯朴素叶贝斯和决策树对威斯康星州乳腺癌(诊断)数据集中的'radius_mean','texture_mean'两各特征都适合做分析实验,效果最好的是svm支持向量机其次到贝叶斯分类器最后是决策树。
提示:本实验不是最好的,仅供参考。