- 最近一直想用機器學習做一個模型,然后暴露服務,提供restful接口給外部調用,這樣也能體現出模型的價值,所以今天稍微搗鼓了一下,之前用過java的weka去做過,但是發現那個好麻煩,而且對很多算法的支持不夠強大,社區好像也沒太多人,所以今天轉向python去做,python機器學習社區還是比較火的,我用的環境是anaconda,在jupyter下面去寫的這個例子,前面主要是模型的訓練,
后面用了python的flask框架做了一個restful接口,這樣直接可以通過接口訪問,直接通過json進行交互,屏蔽了平臺的差異性。
import sys
print('Python: {}'.format(sys.version))
# scipy
import scipy
print('scipy: {}'.format(scipy.__version__))
# numpy
import numpy
print('numpy: {}'.format(numpy.__version__))
# matplotlib
import matplotlib
print('matplotlib: {}'.format(matplotlib.__version__))
# pandas
import pandas
print('pandas: {}'.format(pandas.__version__))
# scikit-learn
import sklearn
print('sklearn: {}'.format(sklearn.__version__))
# Load libraries
import pandas
from pandas.tools.plotting import scatter_matrix
import matplotlib.pyplot as plt
from sklearn import model_selection
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
from flask import Flask
def study():
# Load dataset
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']
dataset = pandas.read_csv(url, names=names)
# Split-out validation dataset
array = dataset.values
X = array[:,0:4]
Y = array[:,4]
validation_size = 0.20
seed = 7
X_train, X_validation, Y_train, Y_validation = model_selection.train_test_split(X, Y, test_size=validation_size, random_state=seed)
# Test options and evaluation metric
seed = 7
scoring = 'accuracy'
# Spot Check Algorithms
models = []
models.append(('LR', LogisticRegression()))
models.append(('LDA', LinearDiscriminantAnalysis()))
models.append(('KNN', KNeighborsClassifier()))
models.append(('CART', DecisionTreeClassifier()))
models.append(('NB', GaussianNB()))
models.append(('SVM', SVC()))
# evaluate each model in turn
results = []
names = []
result = ""
for name, model in models:
kfold = model_selection.KFold(n_splits=10, random_state=seed)
cv_results = model_selection.cross_val_score(model, X_train, Y_train, cv=kfold, scoring=scoring)
results.append(cv_results)
names.append(name)
msg = "%s: %f (%f)" % (name, cv_results.mean(), cv_results.std())
result = result + msg
return result
app = Flask(__name__)
@app.route('/')
def index():
return study();
if __name__ == '__main__':
app.run(host='127.0.0.1',port=3366)
- 運行結果
Python: 3.6.1 |Anaconda 4.4.0 (x86_64)| (default, May 11 2017, 13:04:09)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)]
scipy: 0.19.0
numpy: 1.12.1
matplotlib: 2.0.2
pandas: 0.20.1
sklearn: 0.18.1
* Running on [http://127.0.0.1:3366/](http://127.0.0.1:3366/) (Press CTRL+C to quit)
- 調用rest api結果
- 感想與計劃
之前一直覺得做一件事很難,的確,做好一件事并不簡單,但是要是去入門什么的確實十分的簡單,上面貼的那么多代碼,我并不知道每個函數的具體用法,但是我可以推測出每個函數大致是在干什么,每個參數大致代表什么意思,因為我對機器學習這個流程很了解,所以我知道每一部分的代碼在做什么,
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'class']
dataset = pandas.read_csv(url, names=names)
# Split-out validation dataset
array = dataset.values
X = array[:,0:4]
Y = array[:,4]
比如說上面的url表示的就是數據集的鏈接,names就是表示數據集的feature和target,很顯然前面四個是這個數據集的feature也就是有4個特征,最后的class應該就是target(結論)。
那么接下來就是通過pandas去讀取這個文件,當然pandas我也不知道是什么,但是我能猜出來大致是要通過這個url下載這個文件,而且保存為csv格式,然后給這些記錄加上名稱。
然后array就是取這個數據集里的值,X就是取0=<X<4列的數據,Y也就是取第4列的數據,作為target,在我們去做一些未知的事情的時候,有時類比和猜想能讓我們快速的入門,即使有時候我們猜想是錯誤的,但是我們畢竟在這個過程中注入了自己的想法,這個和看到不懂的不會的直接去google差距還是很大的,后者也能解決問題,但是有一種依賴,前者或許有時候不能快速的解決問題,但是卻能夠培養我們一種良好的思維方式。記得之前在實習的時候,老大分給我一個任務,對于當時的我來說真的亞歷山大,但是在我的努力下還是做出來了,雖然做的不夠好有很多問題,但是經過后來的慢慢優化,一樣可以做的很好,我們都是在成長,都是在學習,解決問題的方式很重要,有沒有自己的想法也很重要,這也是我最近工作所感觸最深的。
接下來計劃把機器學習的庫和工具熟練使用,這個過程就是去多做多看的過程,下面推薦一下官方文檔,scikit-learn 這個就是python機器學習算法的庫的教程,里面有大量的實例
http://scikit-learn.org/stable/documentation.html
既然用python去處理數據,有時候去找數據之前的關系的時候畫圖是最直觀的http://matplotlib.org/api/pyplot_api.html ,patplotlib是python廣泛使用的畫圖庫,很好用。
https://docs.scipy.org/doc/numpy-dev/user/quickstart.html ,python處理數據的時候,涉及到一些科學計算,numpy是python比較有名的科學計算庫,主要是數組的一些處理。
http://pandas.pydata.org/pandas-docs/stable/10min.html# pandas也是對于數據的處理,依賴于numpy,但是提供了一些更高級的操作,提供了豐富的時間序列功能,數據對齊, groupby, merge and join 方法,在金融領域得到廣泛的應用