数据挖掘-ionosphere数据集-k近邻算法-分类预测

转载自:https://blog.csdn.net/zhangyingchengqi/article/details/54883777

  1. #!/usr/bin/env python2  
  2. # -- coding: utf-8 --  
  3.   
  4. #检测系统用户路径  
  5. import os  
  6. home_folder=os.path.expanduser(”~”)  
  7. print(“user’s path {0}”.format(home_folder))  
  8.   
  9. #拼接数据集位置  
  10. data_folder=os.path.join(home_folder,”Data”,“Ionosphere”)  
  11. data_filename=os.path.join(data_folder,”ionosphere.data”)  
  12. print(“dataset’s path {0}”.format(data_filename))  
  13.   
  14. #引入数据集  
  15. import csv  
  16. import numpy as np  
  17.   
  18. X=np.zeros((351,34),dtype=‘float’)   #存351行数据  
  19. y=np.zeros((351,),dtype=‘bool’)     #存对应的351个结果  
  20.   
  21. #ionosphere数据集描述:   
  22. ”’ 
  23.     电离层数据集(Ionosphere Dataset)需要根据给定的电离层中的*电子的雷达回波预测大气结构。 
  24.      它是一个二元分类问题。每个类的观察值数量不均等,一共有 351 个观察值,34 个输入变量和1个输出变量。变量名如下: 
  25. 1 17对雷达回波数据。 
  26. 2 类(g 表示好,b 表示坏)。 
  27. 预测最普遍类的基准性能是约 64% 的分类准确率,最佳结果达到约 94% 的分类准确率。 
  28. ”’  
  29. with open(data_filename,’r’) as input_file:  
  30.     reader=csv.reader(input_file)  
  31.     for i,row in enumerate(reader):  
  32.         #获取每一行的数据,最后一列不要,并将数据转为float  
  33.         data=[float(datum) for datum in row[:-1]]  
  34.         #将取出的这一行数据存到X中  
  35.         X[i]=data  
  36.         #最后将最后一列的数据转为 1或0  
  37.         y[i]=row[-1]==‘g’  
  38.           
  39. #以上已经将数据集取出来,测试一下  
  40. X  
  41. y  
  42.   
  43. #接下来将数据集切为训练集和测试集  
  44. from sklearn.cross_validation import train_test_split  
  45. x_train,x_test,y_train,y_test=train_test_split(X,y,random_state=14)  
  46. print(“training dataset: {0}”.format(x_train.shape[0] ))  
  47. print(“testing dataset: {0}”.format( x_test.shape[0]))  
  48. print(“ each sample has {0} features”.format( x_train.shape[1]))  
  49.   
  50. #引入 k近邻算法  
  51. from sklearn.neighbors import KNeighborsClassifier  
  52. estimator=KNeighborsClassifier()   #目前都使用默认参数  
  53. #开始训练  
  54. estimator.fit(x_train,y_train)  
  55. #开始预测  
  56. y_predicted=estimator.predict(x_test)  
  57.   
  58. #输出标准结果  
  59. y_test  
  60. #输出预测结果  
  61. y_predicted  
  62.   
  63. #评估算法效果  
  64. accuracy=np.mean(y_test==y_predicted)100  
  65. print(“the accuracy is {0:.1f}%”.format(accuracy))    #   86.4%  
  66.   
  67. #为了避免一次性测试的运气问题,我们引入交叉检验  
  68. from sklearn.cross_validation import cross_val_score  
  69. scores=cross_val_score(estimator,X,y,scoring=’accuracy’)  
  70. average_accuacy=np.mean(scores)100  
  71. print(“the average accuracy is {0:.1f}%”.format(average_accuacy))    # 82.3%  
  72.   
  73. ###############################################################################  
  74. #接下来,通过调整参数来提高预测的准确性  
  75. #KNeighborsClassifier分类器最重要的参数是 设定几个近邻   n_neighbors  
  76. #下面将近邻参数从1到20测试一下  
  77. avg_scores=[]  
  78. all_scores=[]  
  79. parameter_values=list(range(1,21))    
  80. for n_neighbors in parameter_values:  
  81.     estimator=KNeighborsClassifier(n_neighbors=n_neighbors)  
  82.     scores=cross_val_score(estimator,X,y,scoring=’accuracy’)  
  83.     avg_scores.append( np.mean(scores))  
  84.     all_scores.append( scores)  
  85.       
  86. #使用图来分析一下n_neighbors的不同取值与分类正确率的关系  
  87. from matplotlib import pyplot as plt  
  88. plt.figure(figsize=(32,20))  
  89. plt.plot( parameter_values, avg_scores,’-o’,linewidth=5,markersize=24)  
  90.   
  91. #随着近邻数的增加,准确率在下降.

数据挖掘-ionosphere数据集-k近邻算法-分类预测