scikit-learn 交叉验证绘图及原理实践 分类:机器学习Sklearn

来源:互联网 发布:辽宁11选5遗漏数据 编辑:程序博客网 时间:2024/06/06 09:03
交叉验证返回的是平均均方误或平均判定正确率。

[python] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. from sklearn import datasets  
  2. from sklearn.cross_validation import cross_val_predict  
  3. from sklearn import linear_model  
  4. import matplotlib.pyplot as plt  
  5.   
  6. lr = linear_model.LinearRegression()  
  7. boston = datasets.load_boston()  
  8. y = boston.target  
  9.   
  10. #cross_val_predict returns an array of the same size as ‘y’ where each entry  
  11. #is a prediction obtained by cross validated  
  12.   
  13. predicted = cross_val_predict(lr, boston.data, y, cv = 10)  
  14.   
  15. fig, ax = plt.subplots()  
  16. ax.scatter(y, predicted)  
  17. ax.plot([y.min(), y.max()], [y.min(), y.max()], ’k–’, lw = 4)  
  18. ax.set_xlabel(”Measured”)  
  19. ax.set_ylabel(”Predicted”)  
  20. plt.show()  
from sklearn import datasetsfrom sklearn.cross_validation import cross_val_predictfrom sklearn import linear_modelimport matplotlib.pyplot as pltlr = linear_model.LinearRegression()boston = datasets.load_boston()y = boston.target
#cross_val_predict returns an array of the same size as 'y' where each entry#is a prediction obtained by cross validatedpredicted = cross_val_predict(lr, boston.data, y, cv = 10)fig, ax = plt.subplots()ax.scatter(y, predicted)ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw = 4)ax.set_xlabel("Measured")ax.set_ylabel("Predicted")plt.show()

上面ax.plot中’k–’,k指线为黑色,–是线的形状。lw指定线宽。



下面对上面的cross_val_predict进行展开:

[python] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. import numpy as np  
  2. from sklearn import cross_validation  
  3. from sklearn import datasets  
  4. from sklearn import svm  
  5.   
  6. iris = datasets.load_iris()  
  7. print iris.data.shape, iris.target.shape  
  8.   
  9. X_train, X_test, y_train, y_test = cross_validation.train_test_split(  
  10.  iris.data, iris.target, test_size = 0.4, random_state = 0)  
  11.   
  12. print X_train.shape, y_train.shape  
  13. print X_test.shape, y_test.shape  
  14.   
  15. ”’ 
  16. statas_dict = dict() 
  17. for element in iris.target: 
  18.  if statas_dict.get(element): 
  19.   statas_dict[element] += 1 
  20.  else: 
  21.   statas_dict[element] = 1 
  22.  
  23. print statas_dict 
  24. ”’  
  25.   
  26. #print np.bincount(iris.target)  
  27. #print np.unique(iris.target, return_counts = True)  
  28.   
  29.   
  30. clf = svm.SVC(kernel = ’linear’, C = 1).fit(X_train, y_train)  
  31. print clf.score(X_test, y_test)  
  32. print  
  33.   
  34. clf = svm.SVC(kernel = ’linear’, C = 1)  
  35. scores = cross_validation.cross_val_score(clf, iris.data, iris.target, cv = 5)  
  36.   
  37. print scores  
  38. print  
  39.    
  40.   
  41. def generate_split_sample(data, target, size_ratio):  
  42.  return cross_validation.train_test_split(data, target, test_size = size_ratio)  
  43.   
  44. #cv is the folds we need  
  45. #use the size_ratio to the abs num  
  46. def sample_split(data, target ,cv):  
  47.  size_num = int(data.shape[0] / cv)  
  48.  ori_data = data  
  49.  ori_target = target  
  50.   
  51.  ListRequire = []  
  52.   
  53.  for i in range(cv):  
  54.   if ori_data.shape[0] > size_num:  
  55.    X_train, X_test, y_train, y_test = generate_split_sample(ori_data, ori_target, size_num)  
  56.    ListRequire.append((X_test, y_test))  
  57.    ori_data = X_train  
  58.    ori_target = y_train  
  59.   else:  
  60.    ListRequire.append((ori_data, ori_target))  
  61.   
  62.  return ListRequire  
  63.   
  64. #print sample_split(iris.data, iris.target, 5)  
  65.   
  66. def return_score(train_data, train_target, test_data, test_target):  
  67.  clf = svm.SVC(kernel = ’linear’, C = 1).fit(train_data, train_target)  
  68.  return clf.score(test_data, test_target)  
  69.   
  70. def return_scores(data, target, cv):  
  71.  ListRequire = []  
  72.  splitList = sample_split(data, target, cv)  
  73.  for i in range(len(splitList)):  
  74.   test_data, test_target = splitList[i]  
  75.   
  76.   otherIndexs = set(range(len(splitList)))  
  77.   otherIndexs.remove(i)  
  78.   
  79.   train_data = None  
  80.   train_target = None  
  81.   
  82.   for j in otherIndexs:  
  83.    if type(train_data) == type(None):  
  84.     train_data, train_target = splitList[j]  
  85.    else:  
  86.     train_data = np.append(train_data, splitList[j][0], axis = 0)  
  87.     train_target = np.append(train_target, splitList[j][1], axis = 0)  
  88.   
  89.   ListRequire.append(return_score(train_data, train_target, test_data, test_target))  
  90.   
  91.  return ListRequire  
  92.   
  93. print return_scores(iris.data, iris.target, 5)  
import numpy as npfrom sklearn import cross_validationfrom sklearn import datasetsfrom sklearn import svmiris = datasets.load_iris()print iris.data.shape, iris.target.shapeX_train, X_test, y_train, y_test = cross_validation.train_test_split( iris.data, iris.target, test_size = 0.4, random_state = 0)print X_train.shape, y_train.shapeprint X_test.shape, y_test.shape'''statas_dict = dict()for element in iris.target: if statas_dict.get(element):  statas_dict[element] += 1 else:  statas_dict[element] = 1print statas_dict'''
#print np.bincount(iris.target)#print np.unique(iris.target, return_counts = True)clf = svm.SVC(kernel = 'linear', C = 1).fit(X_train, y_train)print clf.score(X_test, y_test)printclf = svm.SVC(kernel = 'linear', C = 1)scores = cross_validation.cross_val_score(clf, iris.data, iris.target, cv = 5)print scoresprint def generate_split_sample(data, target, size_ratio): return cross_validation.train_test_split(data, target, test_size = size_ratio)#cv is the folds we need#use the size_ratio to the abs numdef sample_split(data, target ,cv): size_num = int(data.shape[0] / cv) ori_data = data ori_target = target ListRequire = [] for i in range(cv):  if ori_data.shape[0] > size_num:   X_train, X_test, y_train, y_test = generate_split_sample(ori_data, ori_target, size_num)   ListRequire.append((X_test, y_test))   ori_data = X_train   ori_target = y_train  else:   ListRequire.append((ori_data, ori_target)) return ListRequire#print sample_split(iris.data, iris.target, 5)def return_score(train_data, train_target, test_data, test_target): clf = svm.SVC(kernel = ‘linear’, C = 1).fit(train_data, train_target) return clf.score(test_data, test_target)def return_scores(data, target, cv): ListRequire = [] splitList = sample_split(data, target, cv) for i in range(len(splitList)):  test_data, test_target = splitList[i]  otherIndexs = set(range(len(splitList)))  otherIndexs.remove(i)  train_data = None  train_target = None  for j in otherIndexs:   if type(train_data) == type(None):    train_data, train_target = splitList[j]   else:    train_data = np.append(train_data, splitList[j][0], axis = 0)    train_target = np.append(train_target, splitList[j][1], axis = 0)  ListRequire.append(return_score(train_data, train_target, test_data, test_target)) return ListRequireprint return_scores(iris.data, iris.target, 5)

这里自实现了抽样过程,并得到相同结果。

random_state:伪随机数生成初值。test_size: 决定随机生成的test集合占总样本的比例。
svm.SVC svc指支持向量机分类。参数C指定penalty parameter
clf.score(X, y):指出用来进行拟合模型的(X, y)的正确率。

有两种返回ndarray中分类数据个数统计的方法,推荐第二总方法。
np.bincount(ndarray_object): 仅仅返回排序后统计个数的ndarray
np.unique(ndarray_object, return_count = False) :return_count设定为True时可以返回类别及计数。

np.append(first_ndarray, second_ndarray, axis = 0) :沿纵向进行扩展

这里利用了类型判断,这同样可以对np.ndarray进行(仅需初始化一个空对象 i.e. type(np.array([0, 1])) == type(np.ndarray([0])))
利用ndarray进行初始化也是最简单的(也可能是最快的)多维数组初始化方法。

根据文档,cross_val_predict 与 cross_val_score有相同的接口,不同是前者返回的是相应样本在对应测试集上
进行拟合的结果,细节不述。














更多了解请浏览:http://blog.csdn.net/sinat_30665603

阅读全文
0 0