SVM进行乳腺癌预测

一、数据获取

import matplotlib
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn import svm
from sklearn.preprocessing import StandardScaler
import numpy as np
#加载数据源
data = pd.read_csv(r'C:\Users\john\Desktop\暑假论文\乳腺癌预测SVM\breast_cancer_data-master\breast_cancer_data-master\data.csv')

二、数据探索

查看数据的基本情况,可以看到个字段数据有没有缺失

data.info()
data.columns

SVM进行乳腺癌预测_第1张图片

SVM进行乳腺癌预测_第2张图片

三、数据清洗

没有缺失值、异常值。32 个字段里,id 是没有实际含义的,可以去掉。diagnosis 字段的取值为 B 或者 M,我们可以用 0 和 1 来替代()。另外其余的 30 个字段,其实可以分成三组字段,下划线后面的 mean、se 和 worst 代表了每组字段不同的度量方式,分别是平均值、标准差和最大值。

#id没有实际意思,去掉
data.drop('id',axis=1,inplace=True)#inplace=True不创建新的对象,直接对原始对象进行修改;
#diagnosis字段的取值即分类结果为B或M,可以用0和1来替代
data['diagnosis'] = data['diagnosis'].map({'M':1,'B':0})
#后面30个字段可以分成3组
featurs_mean = list(data.columns[1:11])
featurs_se = list(data.columns[12:21])
featurs_worst = list(data.columns[22:31])

四、特征选择

#肿瘤结果可视化
#看整体良性,恶行肿瘤的诊断情况
sns.countplot(data['diagnosis'],label='Count')
plt.show()
#看整体良性、恶性肿瘤的诊断情况
corr = data[featurs_mean].corr()
plt.figure(figsize=(14,14))
sns.heatmap(corr,annot=True)     #annot = True 显示每个方格的数据
plt.show()

SVM进行乳腺癌预测_第3张图片

 

SVM进行乳腺癌预测_第4张图片

 热力图中对角线上的为单变量自身的相关系数是 1。颜色越浅代表相关性越大。所以你能看出来 radius_mean、perimeter_mean 和 area_mean 相关性非常大,compactness_mean、concavity_mean、concave_points_mean 这三个字段也是相关的,因此我们可以取其中的一个作为代表。我们能看到 mean、se 和 worst 这三组特征是对同一组内容的不同度量方式,我们可以保留 mean 这组特征,在特征选择中忽略掉 se 和 worst。同时我们能看到 mean 这组特征中,radius_mean、perimeter_mean、area_mean 这三个属性相关性大,compactness_mean、daconcavity_mean、concave points_mean 这三个属性相关性大。我们分别从这 2 类中选择 1 个属性作为代表,比如 radius_mean 和 compactness_mean。

 

features_remain = ['radius_mean','texture_mean','smoothness_mean','compactness_mean',
                   'symmetry_mean','fractal_dimension_mean']

六、模型训练

使用了LinearSVC()与SVC()进行比较

#模型训练
#抽取30%数据作为测试集,其他作为训练集
train,test = train_test_split(data,test_size=0.3)
train_x = train[features_remain]
train_y = train['diagnosis']
test_x = test[features_remain]
test_y = test['diagnosis']

#采用Z-score规范化数据,保证每个特征维度均值为0,方差为1
ss = StandardScaler()
train_x = ss.fit_transform(train_x)
test_x = ss.transform(test_x)

#创建SVM分类器
model = svm.SVC()
#训练
model.fit(train_x,train_y)
#测试集做预测
prediction = model.predict(test_x)
print('训练集准确率:',model.score(train_x,train_y))
print('测试集准确率:',model.score(test_x,test_y))

#LinearSVC()
model = svm.LinearSVC()
#训练
model.fit(train_x,train_y)
#测试集做预测
prediction = model.predict(test_x)
print('训练集准确率:',model.score(train_x,train_y))
print('测试集准确率:',model.score(test_x,test_y))

SVM进行乳腺癌预测_第5张图片

 

你可能感兴趣的:(Python,机器学习)