• 【Python自然语言处理】使用SVM、随机森林法、梯度法等多种方法对病人罹患癌症预测实战(超详细 附源码)


    需要源码和数据集请点赞关注收藏后评论区留言私信~~~

    一、数据集背景

    • 乳腺癌数据集是由加州大学欧文分校维护的 UCI 机器学习存储库。

    • 数据集包含 569 个恶性和良性肿瘤细胞样本。

    • 样本类别分布:良性357,恶性212

    • 数据集中的前两列分别存储样本的唯一 ID 编号和相应的诊断(M=恶性,B=良性)。

    • 第 3-32 列包含 30 个实值特征,这些特征是根据细胞核的数字化图像计算得出的,可用于构建模型来预测肿瘤是良性还是恶性。

      • 1= 恶性(癌性)- (M)
      • 0 = 良性(非癌性)- (B)

    为每个样本计算十个实值特征:

    • 半径(从中心到周边点的平均距离)
    • 纹理(灰度值的标准偏差)
    • 周长
    • 面积
    • 平滑度(半径长度的局部变化)
    • 紧凑性(周长^2/面积 - 1.0)
    • 凹度(轮廓凹入部分的严重程度)
    • 凹点(轮廓凹入部分的数量)
    • 对称
    • 分形维数

    为每张图像计算这些特征的平均值、标准误差和“最差”或最大(三个最大值的平均值),从而产生 30 个特征。 在本实例中我们仅以特征平均值为对象进行研究。

    接下来导入库文件,主要包括机器学习库Sklearn中的一些模块

    数据清洗和样本显示

    根据实例研究的对象指标,输出部分样本的指标分布特征,如下图所示

     剔除其他指标 仅保留研究对象半径 周长和面积平均值指标 结果如下

    对病人诊断结果进行分类

    目标数据进行归类:

    • 恶性肿瘤 - 1
    • 良性肿瘤 - 0

     绘制各半径 周长 面积指标之间的相关关系如下图

     选择相关性不小于68%作为阈值,分析特征值与罹患恶性肿瘤的关系 结果如下图

     

     

    将数据划分为自变量和因变量 为后续模型分析准备数据

     

    模型分析

    下面使用不同分类方式 获得分析结果并比较分析精度

     可见随机森林法和逻辑回归法的精确度较高 效果较好

     

     

     梯度模型准确性变化趋势分析

    选择梯度模型 分析其在迭代过程中的准确性变化规律

    由下图可见  第二十一次迭代时达到极值 图形阴影部分表示置信区间 

    二、代码 

    部分代码如下  需要源码和数据集请点赞关注收藏后评论区留言私信~~~

    1. #导入库
    2. import matplotlib
    3. import matplotlib.pyplot as plt
    4. import seaborn as sn
    5. from sklearn.svm import SVC
    6. import numpy as np
    7. import pandas as pds
    8. from sklearn.tree import DecisionTreeClassifier
    9. from sklearn.ensemble import RandomForestClassifier
    10. from sklearn.ensemble import GradientBoostingClassifier
    11. from sklearn.ensemble import AdaBoostClassifier
    12. from sklearn.metrics import accuracy_score
    13. from sklearn.metrics import confusion_matrix
    14. from sklearn.preprocessing import StandardScaler
    15. from sklearn.linear_model import LogisticRegression
    16. from sklearn.neighbors import KNeighborsClassifier
    17. import xgboost as xgb
    18. from matplotlib import font_manager
    19. from sklearn.neighbors import LocalOutlierFactor
    20. from sklearn.model_selection import train_test_split
    21. #from sklearn.neighbors import NeighborhoodComponentsAnalysis
    22. fontP = font_manager.FontProperties()
    23. fontP.set_family('SimHei')
    24. fontP.set_size(14)
    25. # In[2]:
    26. # 加载数据
    27. dr = pds.read_csv('./data/data.csv')
    28. # In[3]:
    29. dr.head(5)
    30. # In[4]:
    31. dr.info()
    32. # In[5]:
    33. #dr.drop(['id','Unnamed: 32','fractal_dimension_worst','symmetry_worst','concave points_worst','concavity_worst','compactness_worst','smoothness_worst','area_worst','perimeter_worst','texture_worst','radius_worst','fractal_dimension_se','symmetry_se','concave points_se','concavity_se','compactness_se','smoothness_se','area_se','perimeter_se','texture_se','radius_se','radius_se'], axis = 1 , inplace=True)
    34. dr.drop(['id','Unnamed: 32','texture_mean','smoothness_mean','compactness_mean','concavity_mean','concave points_mean','symmetry_mean','fractal_dimension_mean','fractal_dimension_worst','symmetry_worst','concave points_worst','concavity_worst','compactness_worst','smoothness_worst','area_worst','perimeter_worst','texture_worst','radius_worst','fractal_dimension_se','symmetry_se','concave points_se','concavity_se','compactness_se','smoothness_se','area_se','perimeter_se','texture_se','radius_se','radius_se'], axis = 1 , inplace=True)
    35. dr.info()
    36. # In[6]:
    37. dr.diagnosis.replace({"B":0,"M":1},inplace=True)
    38. # **目标数据进行归类:**
    39. #
    40. # * 恶性肿瘤 - 1
    41. # * 良性肿瘤 - 0
    42. # In[7]:
    43. correlation = dr.corr()
    44. plt.figure(figsize=(7,7))
    45. sn.set(font_scale=1.2)
    46. sn.set(font='SimHei')
    47. sn.heatmap(correlation, cmap='Purples',annot = True,annot_kws={"size": 12}, linewidths=0, linecolor='white', cbar=True, cbar_kws=None, cbar_ax=None, square=False)
    48. # In[8]:
    49. sn.heatmap(correlation, cmap='Purples', xticklabels=['诊断结果', '半径均值', '周长均值', '面积均值'],yticklabels=['诊断结果','半径均值','周长均值', '面积均值'],annot = True,annot_kws={"size": 10}, linewidths=0, linecolor='white', cbar=True, cbar_kws=None, cbar_ax=None, square=False)
    50. # In[9]:
    51. correlation[abs(correlation['diagnosis']) > 0.68].index
    52. # In[10]:
    53. dr.drop('diagnosis', axis=1).corrwith(dr.diagnosis).plot(kind='bar', grid=True, figsize=(6, 6), title="Correlation",color="purple");
    54. # **相关性**
    55. # * 选择相关性不小于68%作为阈值,分析特征值与罹患恶性肿瘤的关系.
    56. #
    57. # In[11]:
    58. correlation = dr.corr()
    59. cancer_threshold = 0.68
    60. filter = np.abs(correlation["diagnosis"]) >= cancer_threshold
    61. correlation.filter = correlation.columns[filter].tolist()
    62. sn.set(font_scale=5.5)
    63. sn.set(font='SimHei')
    64. #sn.clustermap(dr[cf].corr(), figsize=(6, 6), xticklabels=['诊断结果', '面积均值','半径均值', '周长均值'],yticklabels=['周长均值', '半径均值', '面积均值', '诊断结果'],annot = True, annot_kws={"size": 12},cmap="Purples").fig.suptitle("罹患肿瘤相关性分析", fontproperties=fontP,x=0.6, y=1.0)
    65. res=sn.clustermap(dr.corr(), figsize=(6, 6),annot = True, annot_kws={"size": 16},cmap="Purples").fig.suptitle("罹患肿瘤相关性分析", fontproperties=fontP,x=0.6, y=1.0)
    66. # In[ ]:
    67. # In[12]:
    68. #组图
    69. sn.set(font_scale=1.5)
    70. sn.set_style(style='white')
    71. sn.pairplot(dr[correlation.filter],dropna=True,grid_kws=None, diag_kind = "kde", markers = ".", hue = "diagnosis", palette='Purples')
    72. # **去除异常节点**
    73. # In[13]:
    74. from sklearn.neighbors import LocalOutlierFactor
    75. # 将数据划分为自变量和因变量
    76. y=dr["diagnosis"]
    77. x=dr.drop(["diagnosis"],axis=1)
    78. # In[14]:
    79. # -1代表异常节点
    80. outlier= LocalOutlierFactor()
    81. y.predict=outlier.fit_predict(x)
    82. y.predict[0:10]
    83. # In[15]:
    84. x_factor= outlier.negative_outlier_factor_
    85. pds.dataframe= pds.DataFrame()
    86. pds.dataframe["score"]=x_factor
    87. threshold= -2.5
    88. data_filter= pds.dataframe["score"]< threshold
    89. pds_filter_tolist= pds.dataframe[data_filter].index.tolist()
    90. # In[17]:
    91. x= x.drop(pds_filter_tolist)
    92. y= y.drop(pds_filter_tolist).values
    93. # In[18]:
    94. x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=42)
    95. scaler = StandardScaler()
    96. x_nsform(x_test)
    97. # In[19]:
    98. index = ['梯度法','逻辑回归法','近邻法','支持向量机法','决策树法','随机森林法']
    99. model_list = [GradientBoostingClassifier(),LogisticRegression(), KNeighborsClassifier(n_neighbors = 4), SVC(kernel="rbf"), DecisionTreeClassifier(), RandomForestClassifier(n_estimators=600)]
    100. model_dict = dict(zip(index,model_list))
    101. model_dict
    102. # In[20]:
    103. pediction_outcome_list =[]
    104. for i,j in model_dict.items():
    105. j.fit(x_train,y_train)
    106. x_prediction = j.predict(x_test)
    107. accuracy = accuracy_score(y_test, x_prediction)
    108. pediction_outcome_list.append(accuracy)
    109. print(i,"{:.4f}".format(accuracy))
    110. # In[21]:
    111. plt.figure(figsize = (10,4))
    112. sn.barplot(x =index , y =pediction_outcome_list, palette="vlag", ci=95,edgecolor='purple',n_boot=1000, dodge=False)
    113. # In[22]:
    114. gradient_boost = GradientBoostingClassifier(loss='deviance', learning_rate=0.1)
    115. result_list = []
    116. accuracy = []
    117. for j in range(1,28,1):
    118. x_train,x_test,y_train,y_test = train_test_split(x, y, test_size = 0.25, random_state = j)
    119. gradient_boost_fit = gradient_boost.fit(x_train, y_train)
    120. fit_predict_x = gradient_boost_fit.predict(x_test)
    121. accuracy.append(accuracy_score(y_test, fit_predict_x))
    122. result_list.append(j)
    123. # In[23]:
    124. plt.figure(figsize=(10,8))
    125. plt.xlabel("迭代次数",fontsize=14)
    126. plt.
    127. # In[ ]:

    创作不易 觉得有帮助请点赞关注收藏~~~

  • 相关阅读:
    【数据库专题】一文搞懂数据库分库分表的原理
    分享《泰坦陨落2》缺少msvcr120.dll的解决方法,亲测有效的5个修复方法
    Codeforces Round #803 (Div. 2) VP补题
    Shell入门1
    【三维目标检测】PointRCNN(二)
    多视角多行为推荐对比学习
    【考研】数据结构考点——直接选择排序
    产品经理和项目经理谁才是项目管理界的NO.1?
    Nginx+php+mysql+wordpress搭建自己的博客站点
    昇思25天学习打卡营第22天|MindNLP ChatGLM-6B StreamChat
  • 原文地址:https://blog.csdn.net/jiebaoshayebuhui/article/details/128182949