当前位置:   article > 正文

《机器学习》实验三 支持向量机(桂电)

《机器学习》实验三 支持向量机(桂电)

1.Python 的 sklearn 扩展包中包含了“威斯康星州乳腺癌”数据集,其中详细记录了 威斯康星大学附属医院的乳腺癌测量数据。数据集包括 569 行和 31 个特征。可以使用 这个数据集训练一个支持向量机模型,参考代码如下。教师给出部分代码。请输出测试 精度。

参考代码: from sklearn.svm import SVC 12 / 15 from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap # 导入肺癌数据集 data = load_breast_cancer() X = data['data'] y = data['target'] print(X.shape) x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3) # 建立支持向量机模型 clf1 = SVC(kernel='linear') #线性核函数 clf2 = SVC(kernel='rbf', C=10, gamma=0.0001) #采用高斯核函数 clf1.fit(x_train, y_train) clf2.fit(x_train, y_train) # 输出两个 SVM 模型的精度。 此处填入你的代码。

SVM模型,即支持向量机(Support Vector Machine),是一种二类分类模型。其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。

以下是一些SVM模型的应用例子:

  1. 图像分类:SVM可以用于图像分类任务,如人脸识别、物体识别等。在这个过程中,首先会对图像进行预处理,例如调整大小、灰度化等,然后提取图像的特征向量,最后利用这些特征向量进行分类。参考李飞飞在2005年发表的论文《A Bayesian Hierarchical Model for Learning Natural Scene Categories》中的方法,可以通过对每张图进行SIFT+Kmeans聚类+直方图统计构建场景特征的特征库(词库),然后利用SVM对场景进行分类。
  2. 文本分类:SVM可以通过将文本表示为词袋模型或者TF-IDF等特征表示方法,然后训练一个分类器来实现文本分类。这个过程包括数据预处理(对文本进行清洗、分词、去除停用词等处理)、训练模型(使用SVM算法训练一个分类器)以及测试和评估(使用测试集对分类器进行评估,计算准确率、召回率等指标)。
  3. 异常检测:SVM也可以应用于异常检测,即通过训练一个SVM模型,可以检测出与其他样本不同的异常样本。在异常检测中,SVM可以识别出那些与正常样本最不相似的样本。
  1. from sklearn.svm import SVC
  2. from sklearn.datasets import load_breast_cancer
  3. from sklearn.model_selection import train_test_split
  4. import matplotlib.pyplot as plt
  5. from matplotlib.colors import ListedColormap
  6. # 导入肺癌数据集
  7. data = load_breast_cancer()
  8. X = data['data']
  9. y = data['target']
  10. print(X.shape)
  11. x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
  12. # 建立支持向量机模型
  13. clf1 = SVC(kernel='linear') #线性核函数
  14. clf2 = SVC(kernel='rbf', C=10, gamma=0.0001) #采用高斯核函数
  15. clf1.fit(x_train, y_train)
  16. clf2.fit(x_train, y_train)
  17. # 输出两种支持向量机模型的精度。此处填入你的代码。(1)
  18. score1 = clf1.score(x_test, y_test) # 线性核函数的SVM模型在测试集上的精度
  19. score2 = clf2.score(x_test, y_test) # 高斯核函数的SVM模型在测试集上的精度
  20. print(f"SVM with linear kernel test accuracy: {score1}")
  21. print(f"SVM with RBF kernel test accuracy: {score2}")

线性核函数和高斯核函数学习参考:


2. 保持公司的员工满意的问题是一个长期存在且历史悠久的挑战。如果公司投入了大量 时间和金钱的员工离开,那么这意味着公司将不得不花费更多的时间和金钱来雇佣其他 人。以 IBM 公司的员工流失数据集(HR-Employee-Attrition.csv)作为处理对象,使用 第三方模块 sklearn 中的相关类来建立支持向量机模型,进行 IBM 员工流失预测。教师 给出部分代码。要求:1)对数据集做适当的预处理操作,2)划分 25%的数据集作为测 试数据,3)输出支持向量,4)输出混淆矩阵,计算查准率、查全率和 F1 度量,并绘 制 P-R 曲线和 ROC 曲线。 说明:数据集的第 2 列(Attrition)为员工流失的类别。

  1. import numpy as np
  2. import pandas as pd
  3. #导入数据,地址根据文件地址更改
  4. df = pd.read_csv('HR-Employee-Attrition.csv')
  5. df.head()
  6. #第一题:数据预处理
  7. df.nunique().nsmallest(10) # 无效列值检查
  8. # EmployeeCount, Over18 and StandardHours 这些属性值完全相同
  9. # 删除无效列值
  10. df.drop(['StandardHours', 'EmployeeCount', 'Over18', 'EmployeeNumber'], axis=1, inplace=True)
  11. df.isnull().sum() # 缺失值检查
  12. df[df.duplicated()] # 重复值检查
  13. df.head()
  14. #中文编码为数字
  15. from sklearn.preprocessing import LabelEncoder
  16. #LabelEncoder对非数字格式列编码
  17. dtypes_list=df.dtypes.values#取出各列的数据类型
  18. columns__list=df.columns#取出各列列名
  19. #循环遍历每一列找出非数字格式进行编码
  20. for i in range(len(columns__list)):
  21. if dtypes_list[i] == 'object':#判断类型
  22. lb=LabelEncoder() # 导入LabelEncoder模型
  23. lb.fit(df[columns__list[i]]) # 训练
  24. df[columns__list[i]] = lb.transform(df[columns__list[i]]) # 编码\
  25. df.head()
  26. #查看各列相关性
  27. import matplotlib.pyplot as plt
  28. import seaborn as sns
  29. corr=df.corr()
  30. corr.head()
  31. sns.heatmap(corr,xticklabels=corr.columns.values,yticklabels=corr.columns.values)
  32. plt.show()
  33. #黑色负相关,白色正相关
  34. '''通过热力图下,可以看到
  35. MonthlyIncome 与 JobLevel 相关性较强;
  36. TotalWorkingYears 与 JobLevel 相关性较强;
  37. TotalWorkingYears 与 MonthlyIncome 相关性较强;
  38. PercentSalaryHike 与 PerformanceRating 相关性较强;
  39. YearsInCurrentRole 与 YearsAtCompany 相关性较强;
  40. YearsWithCurrManager 与 YearsAtCompany 相关性较强;
  41. StockOptionLevel与MaritalStatus成负相关,删除其中一列'''
  42. df.drop(['JobLevel', 'TotalWorkingYears', 'YearsInCurrentRole', 'YearsWithCurrManager',
  43. 'PercentSalaryHike', 'StockOptionLevel'],axis=1, inplace=True)
  44. df.head()
  45. # 特征提取
  46. X = df.drop(['Attrition'], axis=1)
  47. y = df['Attrition']
  48. # 标准化数据
  49. from sklearn.preprocessing import StandardScaler
  50. sc = StandardScaler()
  51. X = sc.fit_transform(X)
  52. mean = np.mean(X, axis=0)
  53. print('均值')
  54. print(mean)
  55. standard_deviation = np.std(X, axis=0)
  56. print('标准差')
  57. print(standard_deviation)
  58. # 第二题:划分 25%的数据集作为测试数据
  59. from sklearn.model_selection import train_test_split
  60. # 此处填入你的代码。(1)
  61. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)
  62. X_train
  63. from sklearn.svm import SVC
  64. from sklearn import metrics
  65. from sklearn.metrics import confusion_matrix
  66. from sklearn.metrics import accuracy_score
  67. from sklearn.metrics import roc_curve, auc
  68. # 默认
  69. svc=SVC()
  70. svc.fit(X_train,y_train)
  71. y_pred=svc.predict(X_test)
  72. print('Accuracy Score:')
  73. # 输出Accuracy Score。此处填入你的代码。(2)
  74. accuracy = accuracy_score(y_test, y_pred) # 计算准确率
  75. print(accuracy) # 打印准确率
  76. #输出支持向量
  77. print('支持向量:',np.matrix(svc.fit(X_train, y_train).support_vectors_))
  78. # 第三题:混淆矩阵
  79. y_pred = svc.predict(X_test)
  80. # 获取混淆矩阵。此处填入你的代码。(3)
  81. print('Confusion Matrix:')
  82. cnf_matrix = confusion_matrix(y_test, y_pred)
  83. print(cm)
  84. class_names = [0, 1] # name of classes
  85. fig, ax = plt.subplots()
  86. tick_marks = np.arange(len(class_names))
  87. plt.xticks(tick_marks, class_names)
  88. plt.yticks(tick_marks, class_names)
  89. plt.tight_layout()
  90. plt.title('Confusion matrix', y=1.1)
  91. plt.ylabel('Actual label')
  92. plt.xlabel('Predicted label')
  93. # create heatmap
  94. sns.heatmap(pd.DataFrame(cnf_matrix), annot=True, cmap="YlGnBu", fmt='g')
  95. ax.xaxis.set_label_position("top")
  96. # 第四题:准确度、精确度和召回率
  97. print("Accuracy:", metrics.accuracy_score(y_test, y_pred))
  98. print("Precision:", metrics.precision_score(y_test, y_pred))
  99. print("Recall:", metrics.recall_score(y_test, y_pred))
  100. # 输出F1_score。此处填入你的代码。(4)
  101. print("F1_score:",metrics.f1_score(y_test, y_pred, average='binary'))
  102. #第四题:PR曲线
  103. from sklearn.metrics import precision_recall_curve
  104. y_scores = svc.decision_function(X_test)
  105. plt.figure("P-R Curve")
  106. plt.title('Precision/Recall Curve')
  107. plt.xlabel('Recall')
  108. plt.ylabel('Precision')
  109. #y_test为样本实际的类别,y_scores为样本为正例的概率
  110. precision, recall, thresholds = precision_recall_curve(y_test, y_scores)
  111. # 绘制recall,precision曲线。此处填入你的代码。(5)
  112. plt.plot(recall, precision, marker='.')
  113. # 可选:绘制无信息率线(对角线),表示随机预测的性能
  114. plt.plot([0, 1], [0, 1], linestyle='--')
  115. # 可选:显示网格
  116. plt.grid(True)
  117. # 显示图形
  118. plt.show()
  119. #第四题: 绘制ROC曲线
  120. # 模型预测
  121. # sklearn_predict = sklearn_logistic.predict(X_test)
  122. # y得分为模型预测正例的概率
  123. # y_score = sklearn_logistic.predict_proba(X_test)[:,1]
  124. y_scores= svc.decision_function(X_test)
  125. # 计算不同阈值下,fpr和tpr的组合值,其中fpr表示1-Specificity,tpr表示Sensitivity
  126. fpr,tpr,threshold = metrics.roc_curve(y_test, y_scores)
  127. # 计算AUC的值
  128. roc_auc = metrics.auc(fpr,tpr)
  129. # 绘制面积图
  130. plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5, edgecolor = 'black')
  131. # 添加边际线
  132. plt.plot(fpr, tpr, color='black', lw = 1)
  133. # 添加对角线
  134. plt.plot([0,1],[0,1], color = 'red', linestyle = '--')
  135. # 添加文本信息
  136. plt.text(0.5,0.3,'ROC curve (area = %0.2f)' % roc_auc)
  137. # 添加x轴与y轴标签
  138. plt.xlabel('1-Specificity')
  139. plt.ylabel('Sensitivity')
  140. # 显示图形
  141. plt.show()

 

3. (可选,加分)手写字母的识别问题。对于手写英文字母,可以根据写入字母的特征 信息(字母的宽度、高度、边际)来判断其属于哪一种字母。手写体字母数据集一共包 含 20000 个样本,每个样本有 17 个特征,其中 letter 为类别,具体值就是 20 个英文字 母。请利用对该数据集训练一个 SVM 模型,进行分类判断

  1. import pandas as pd
  2. from sklearn.model_selection import train_test_split
  3. from sklearn.preprocessing import StandardScaler
  4. from sklearn.svm import SVC
  5. from sklearn.metrics import classification_report
  6. from sklearn.metrics import classification_report, roc_curve, auc, precision_recall_curve
  7. import matplotlib.pyplot as plt
  8. # 假设数据保存在CSV文件中,列名与问题描述中一致
  9. def load_dataset(file_path):
  10. """
  11. 从CSV文件加载数据集。
  12. 参数:
  13. file_path (str): 数据集的路径。
  14. 返回:
  15. pandas.DataFrame: 加载的数据集。
  16. """
  17. return pd.read_csv(file_path)
  18. def preprocess_data(df):
  19. """
  20. 预处理数据,包括特征缩放和标签编码。
  21. 参数:
  22. df (pandas.DataFrame): 原始数据集。
  23. 返回:
  24. tuple: 包含特征矩阵X和标签y的元组。
  25. """
  26. # 假设第一列是类别列,其余列是特征列
  27. X = df.iloc[:, 1:] # 特征数据
  28. y = df.iloc[:, 0] # 类别数据
  29. # 类别编码,这里我们假设'letter'列已经是字符串形式的字母
  30. # 在实际应用中,可能需要先将其转换为数值型标签
  31. # 这里简化处理,直接使用字母索引作为标签
  32. y = y.map(lambda x: ord(x.upper()) - ord('A'))
  33. # 特征缩放
  34. scaler = StandardScaler()
  35. X_scaled = scaler.fit_transform(X)
  36. return X_scaled, y
  37. def train_svm_model(X_train, y_train):
  38. """
  39. 训练SVM模型。
  40. 参数:
  41. X_train (numpy.ndarray): 训练特征。
  42. y_train (numpy.ndarray): 训练标签。
  43. 返回:
  44. SVC: 训练好的SVM模型。
  45. """
  46. model = SVC(kernel='rbf', C=1.0, gamma='scale') # 使用RBF核,C和gamma设为默认值
  47. model.fit(X_train, y_train)
  48. return model
  49. def evaluate_model(model, X_test, y_test):
  50. """
  51. 评估模型性能。
  52. 参数:
  53. model (SVC): 训练好的SVM模型。
  54. X_test (numpy.ndarray): 测试特征。
  55. y_test (numpy.ndarray): 测试标签。
  56. 返回:
  57. str: 模型的分类报告。
  58. """
  59. y_pred = model.predict(X_test)
  60. report = classification_report(y_test, y_pred)
  61. return report
  62. # 假设数据保存在'handwritten_letters.csv'文件中
  63. data_path = 'handwritten_letters.csv'
  64. df = load_dataset(data_path)
  65. X, y = preprocess_data(df)
  66. # 划分训练集和测试集
  67. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  68. # 训练SVM模型
  69. svm_model = train_svm_model(X_train, y_train)
  70. # 评估模型
  71. report = evaluate_model(svm_model, X_test, y_test)
  72. print(report)
  73. """Precision(精确度):精确度衡量的是模型预测为正样本的实例中,真正为正样本的比例。
  74. 计算公式为:Precision = TP / (TP + FP),其中TP(True Positives)是真正例,FP(False Positives)是假正例。
  75. Recall(召回率):召回率(也被称为敏感度或真正率)衡量的是所有真正例中被模型正确预测为正样本的比例。
  76. 计算公式为:Recall = TP / (TP + FN),其中FN(False Negatives)是假反例。
  77. F1-score:(精确度和召回率的调和平均数),用于综合评估模型的性能。当精确度和召回率都很高时,F1分数也会很高。
  78. 计算公式为:F1 = 2 * (Precision * Recall) / (Precision + Recall)。
  79. Support(支持数):支持数指的是每个类别在测试集中的样本数量。在您给出的例子中,每个类别的支持数都是4000,这意味着测试集中有4000个样本属于该类。
  80. Accuracy(准确率):准确率衡量的是模型正确分类的样本比例。
  81. 计算公式为:Accuracy = (TP + TN) / (TP + FP + FN + TN),其中TN(True Negatives)是真反例。
  82. 没有直接显示整体的准确率,
  83. macro avg:宏观平均值是对每个类别的指标进行简单平均,不考虑类别样本数量的差异。
  84. 宏观平均的精确度、召回率和F1分数都是0.95,说明模型在所有类别上的性能都很接近。
  85. weighted avg:加权平均值是根据每个类别的支持数(即样本数量)来加权的指标平均值。
  86. 给予样本数量较大的类别更多的权重。由于每个类别的支持数都是4000,加权平均值和宏观平均值是一样的。
  87. 基于二分类问题。对于多分类问题,每个类别都会有一个对应的精确度、召回率和F1分数,而宏观平均值和加权平均值则是对所有类别指标的平均。"""

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/560932
推荐阅读
相关标签
  

闽ICP备14008679号