顯示具有 learning 標籤的文章。 顯示所有文章
顯示具有 learning 標籤的文章。 顯示所有文章

2017年8月19日 星期六

[Python] 機器學習筆記 - 透過 sklearn.svm 簡易的數據分析、機器學習萬用框架 @ macOS 10.12, Python36

svm_report

幾年前有幸參加過數據分析的黑客松,但是太耍廢了 XD 當下只用統計硬幹。最近有些閒情想好好認識一下 SVM 了。目前使用它的方式很粗淺 XD 就是把一堆 feature 湊個成 array 餵進去跑,接著就有報表可以看了(當初還人工去計算 precision / recall),回想起來真是青春啊

回過頭來,程式架構如下:

import numpy as np
import pandas as pd # 假設 input 是 csv 格式

# 讀取資料中
raw = pd.read_csv("input.csv")
# 可以得知有多少欄位可以用
print(raw.columns)

# 假設所有屬性都是可以有一對一的對應,全部把他們取代成整數,此為 HASH table 用來轉換而已
LOOK_FIELD = {}

# 假設 raw 有一萬筆資料
USE_DATA_COUNT = 10000 # or raw.size

# 將 raw 資料建置成 numpy array 架構

data_input = None
data_output = None

for index, row in raw.iterrows():

data_per_row = np.empty([])

# 將有興趣的欄位(feature)抽出來使用
for field_name in [
"csv_fieldname1",
"csv_fieldname2",
]:
field_data = np.zeros(1, dtype=np.int)
if field_name not in LOOK_FIELD:
LOOK_FIELD[field_name] = {}
if row[field_name] in LOOK_FIELD[field_name]:
field_data[0] = LOOK_FIELD[field_name][row[field_name]]
else:
field_data[0] = len(LOOK_FIELD[field_name])
LOOK_FIELD[field_name][row[field_name]] = field_data[0]
data_per_row = np.append(data_per_row, field_data.reshape(1, -1))

if data_input is None:
data_input = np.zeros([USE_DATA_COUNT, data_per_row.reshape(1, -1).size], dtype=np.float)
data_input[index] = data_per_row.reshape(1, -1)


result = np.zeros([1], dtype=np.int)

output_field_name = "csv_fieldname3"

# 將 結果 的欄位轉換成數值
if output_field_name not in LOOK_FIELD:
LOOK_FIELD[output_field_name] = {}
if row[output_field_name] in LOOK_FIELD[output_field_name]:
result[0] = LOOK_FIELD[output_field_name][ row[output_field_name] ]
else:
result[0] = len(LOOK_FIELD[output_field_name])
LOOK_FIELD[output_field_name][ row[output_field_name] ] = result[0]

if data_output is None:
data_output = np.zeros([USE_DATA_COUNT, result.reshape(1, ).size], dtype=np.int)
data_output[index] = result.reshape(1, )

# 支援只使用 USE_DATA_COUNT 筆資料
if index >= USE_DATA_COUNT - 1:
break

print(data_input)
print(data_output)
print(data_input.shape)
print(data_output.shape)

from sklearn import svm, metrics

classifier = svm.SVC()

# 使用 1/5 的資料來訓練
number_of_data_to_learn = int(USE_DATA_COUNT / 5) # or int(data_output.size/5)

# start to learn
classifier.fit(data_input[:number_of_data_to_learn], data_output[:number_of_data_to_learn])

# get the result
expected = data_output[number_of_data_to_learn:]
predicted = classifier.predict(data_input[number_of_data_to_learn:])

# get the report
print("Classification report for classifier %s:\n%s\n" % (classifier, metrics.classification_report(expected, predicted)))
print("Confusion matrix:\n%s" % metrics.confusion_matrix(expected, predicted))


透過上述的程式架構,未來就只要把資料轉成 csv ,挑挑 feature (csv_fieldname1, csv_fieldname2) 跟 output (csv_fieldname3) 欄位就可以快速看到成果了 XD 要唬人也可以 3 分鐘就弄出點東西。

2016年4月20日 星期三

試用 Microsoft Azure Machine Learning / studio.azureml.net 服務

azureml01

參加了 DevDays Asia 2016 活動,這次本來就看重於 Azure Machine learning 項目,雖然已經多少知道了,但看到講者或是導覽,只需將資料轉成 csv 以及在介面上拖拉一下就完成,還是滿驚豔的 :P
  • http://interopevents.com/taipei2016#taipei2016-speakers
  • https://www.microsoft.com/taiwan/events/devdays/agenda.htm
簡言之,使用者只需要將資料轉成 csv 格式(這邊其實是最多 know-how 的),接著完全用 http://studio.azureml.net/ 介面上傳資料、分割資料、挑選要用的演算法,在拉幾下,收工!

整個過程甚至可以方便地觀看 input 資料、觀看 traning 的結果,甚至在穿接成 web service api 來用都可以。這完全把資料分析中的:資料情境分析、資料科學家、資料工程師的工作,其中後兩者的工作都做完八九成了!

為何說資料情境分析還沒呢?當情境定義完後,而資料的前置處理才是最最重要的一塊,這幾乎還是無人能取代的,若真的說要有,大概就是用 AI 或是 try-and-error 把各種排列組合都自動化處理完,這樣也不是不可以啦 :P

筆記一下流程(建議直接上 studio.azureml.net 看導覽):

azureml02

azureml03

接著,隨意打一些關鍵字,可以找尋到測資:

azureml04

資料有了,接著就是分群,請用 split 關鍵字,依照填寫的比例,把一群拿去 train:

azureml05

再來,就是要 train 了,可以挑選目標欄位:

azureml06

azureml07

接著,用 two class 關鍵字,可以找到一批免錢的演算法 XD

azureml08

最後,再用 score 關鍵字,可以安排後續的動作:

azureml09

azureml10

再按個 Run 就會跑,跑完就可以看資料囉:

azureml11

azureml12

azureml14

azureml15

你以為就這樣而已嗎?其實還可以在串成 Web service api ... 這段就請直接看完導覽就知道了,在此單純文字紀錄上述流程。