天天看點

資料分析之優化算法與模型持久化

一、機器學習算法的參數

     1.影響準确度 ------優化

     2.防止過拟合 ------優化

     3.其他參數

二、網格搜尋優化參數(參數少,3個以内)

     1.原理

        它是通過對周遊已定義參數的清單來評估算法的參數,進而找到最有的參數

     2.示例

In [11]:

from pandas import read_csv
import pandas as pd
from sklearn.linear_model import Ridge
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import GridSearchCV
# 導入資料
pima =pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data',header=None)

# 将資料分為輸入資料和輸出結果
array = pima.values
X = array[:, 0:8]
Y = array[:, 8]

# 算法執行個體化
model = Ridge()
# 設定要周遊的參數
param_grid = {'alpha': [1, 0.1, 0.01, 0.001, 0]}
# 通過網格搜尋查詢最優參數
grid = GridSearchCV(estimator=model, param_grid=param_grid)
grid.fit(X, Y)
# 搜尋結果
print('最高得分:%.3f' % grid.best_score_)
print('最優參數:%s' % grid.best_estimator_.alpha)
      
最高得分:0.280
最優參數:1
      

三、随機搜尋優化參數(參數多,大于3個)

     1.原理

        随機搜尋通過對固定次數的疊代,對算法的參數采用随機采樣分布的方式,搜尋合适的參數

     2.示例

In [10]:

from pandas import read_csv
from sklearn.linear_model import Ridge
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform
# 導入資料
pima =pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data',header=None)

# 将資料分為輸入資料和輸出結果
array = pima.values
X = array[:, 0:8]
Y = array[:, 8]

# 算法執行個體化
model = Ridge()
# 設定要周遊的參數
param_grid = {'alpha': uniform()}
# 通過網格搜尋查詢最優參數
grid = RandomizedSearchCV(estimator=model, param_distributions=param_grid, n_iter=100, random_state=7)
grid.fit(X, Y)
# 搜尋結果
print('最高得分:%.3f' % grid.best_score_)
print('最優參數:%s' % grid.best_estimator_.alpha)
      
最高得分:0.280
最優參數:0.977989511997
      

四、通過pickle來序列化和反序列化機器學習的模型

In [14]:

# Save Model Using Pickle
import pandas
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
import pickle
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
test_size = 0.33
seed = 7
X_train, X_test, Y_train, Y_test = model_selection.train_test_split(X, Y, test_size=test_size, random_state=seed)
# Fit the model on 33%
model = LogisticRegression()
model.fit(X_train, Y_train)
# save the model to disk
filename = 'finalized_model.sav'
pickle.dump(model, open(filename, 'wb'))

# some time later...

# load the model from disk
loaded_model = pickle.load(open(filename, 'rb'))
result = loaded_model.score(X_test, Y_test)
print(result)
      
0.755905511811
      

五、通過Joblib來序列化和發序列化機器學習的模型

In [16]:

# Save Model Using joblib
import pandas
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
from sklearn.externals import joblib
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
test_size = 0.33
seed = 7
X_train, X_test, Y_train, Y_test = model_selection.train_test_split(X, Y, test_size=test_size, random_state=seed)
# Fit the model on 33%
model = LogisticRegression()
model.fit(X_train, Y_train)
# save the model to disk
filename = 'finalized_model.sav'
joblib.dump(model, filename)

# some time later...

# load the model from disk
loaded_model = joblib.load(filename)
result = loaded_model.score(X_test, Y_test)
print(result)
      
0.755905511811
      

六、生成模型的技巧

     1.python版本保持一緻

     2.序列化和反序列化版本一緻

     3.記錄算法調參過程

七、git與參考

git :https://coding.net/u/RuoYun/p/Python-of-machine-learning/git/tree/master

參考:https://read.douban.com/column/6939417/