taoCMS是基于php+sqlite/mysql的国内最小(100Kb左右)的功能完善的CMS管理系统

集成学习自动权重设置python实现

2017-09-10
[python] view plain copy
  1. import pandas as pd  
  2. import numpy as np  
  3. from scipy.optimize import minimize  
  4. from sklearn.cross_validation import StratifiedShuffleSplit  
  5. from sklearn.ensemble import RandomForestClassifier  
  6. from sklearn.linear_model import LogisticRegression  
  7. from sklearn.metrics import log_loss  
  8. import os  
  9.   
  10. os.system("ls ../input")  
  11.   
  12. train = pd.read_csv("../input/train.csv")  
  13. print("Training set has {0[0]} rows and {0[1]} columns".format(train.shape))  
  14.   
  15. labels = train['target']  
  16. train.drop(['target''id'], axis=1, inplace=True)  
  17.   
  18. print(train.head())  
  19.   
  20. ### we need a test set that we didn't train on to find the best weights for combining the classifiers  
  21. sss = StratifiedShuffleSplit(labels, test_size=0.05, random_state=1234)  
  22. for train_index, test_index in sss:  
  23.     break  
  24.   
  25. train_x, train_y = train.values[train_index], labels.values[train_index]  
  26. test_x, test_y = train.values[test_index], labels.values[test_index]  
  27.   
  28. ### building the classifiers  
  29. clfs = []  
  30.   
  31. rfc = RandomForestClassifier(n_estimators=50, random_state=4141, n_jobs=-1)  
  32. rfc.fit(train_x, train_y)  
  33. print('RFC LogLoss {score}'.format(score=log_loss(test_y, rfc.predict_proba(test_x))))  
  34. clfs.append(rfc)  
  35.   
  36. ### usually you'd use xgboost and neural nets here  
  37.   
  38. logreg = LogisticRegression()  
  39. logreg.fit(train_x, train_y)  
  40. print('LogisticRegression LogLoss {score}'.format(score=log_loss(test_y, logreg.predict_proba(test_x))))  
  41. clfs.append(logreg)  
  42.   
  43. rfc2 = RandomForestClassifier(n_estimators=50, random_state=1337, n_jobs=-1)  
  44. rfc2.fit(train_x, train_y)  
  45. print('RFC2 LogLoss {score}'.format(score=log_loss(test_y, rfc2.predict_proba(test_x))))  
  46. clfs.append(rfc2)  
  47.   
  48.   
  49. ### finding the optimum weights  
  50.   
  51. predictions = []  
  52. for clf in clfs:  
  53.     predictions.append(clf.predict_proba(test_x))  
  54.   
  55. def log_loss_func(weights):  
  56.     ''''' scipy minimize will pass the weights as a numpy array '''  
  57.     final_prediction = 0  
  58.     for weight, prediction in zip(weights, predictions):  
  59.             final_prediction += weight*prediction  
  60.   
  61.     return log_loss(test_y, final_prediction)  
  62.       
  63. #the algorithms need a starting value, right not we chose 0.5 for all weights  
  64. #its better to choose many random starting points and run minimize a few times  
  65. starting_values = [0.5]*len(predictions)  
  66.   
  67. #adding constraints  and a different solver as suggested by user 16universe  
  68. #https://kaggle2.blob.core.windows.net/forum-message-attachments/75655/2393/otto%20model%20weights.pdf?sv=2012-02-12&se=2015-05-03T21%3A22%3A17Z&sr=b&sp=r&sig=rkeA7EJC%2BiQ%2FJ%2BcMpcA4lYQLFh6ubNqs2XAkGtFsAv0%3D  
  69. cons = ({'type':'eq','fun':lambda w: 1-sum(w)})  
  70. #our weights are bound between 0 and 1  
  71. bounds = [(0,1)]*len(predictions)  
  72.   
  73. res = minimize(log_loss_func, starting_values, method='SLSQP', bounds=bounds, constraints=cons)  
  74.   
  75. print('Ensamble Score: {best_score}'.format(best_score=res['fun']))  
  76. print('Best Weights: {weights}'.format(weights=res['x']))  


转载自 https://www.kaggle.com/hsperr/otto-group-product-classification-challenge/finding-ensamble-weights

类别:未分组 | 阅读:2236 | 评论:0 | 标签:

想收藏或者和大家分享这篇好文章→

公告

taoCMS发布taoCMS2.5Beta5(最后更新14年05月25日),请大家速速升级,欢迎大家试用和提出您宝贵的意见建议。

捐助与联系

☟请使用新浪微博联系我☟

☟在github上follow我☟

标签云