3.3 教程
如果你剛接觸deepchem,你可能了解基礎。deepchem是什麼?為什麼你要使用它?
簡單的回答案deepchem是乙個科學的機器學習庫。(「chem」提示乙個歷史事實是deepchem早期是注重於化學應用的,
但是我們現在更廣泛的支援所有的科學應用。)
為什麼你想用deepchem而不是其它的機器學習庫呢?簡單的說,deepchem維護了大量的便於科學的深度學習的工具包括載入科學
資料集,過理它們,轉換它們,分割它們,學習它們的類。除此之外deepchem使用大量的其它機器學習框架如scikit-learn, tensorflow, and xgboost。
我們正在實驗增加用pytorch和jax實施的模型。我們的關注點是用手頭能獲得的任務工具以便於科學實驗。
本教程的後面,我們將提供deepchem』s api的快速瀏覽。deepchem是大型庫,所以我們不會覆蓋所有的方面,但是我們會給你足夠的起點。
內容資料處理
特徵工程
資料分割
模型的訓練與評估
更多的教程
3.3.1資料處理
dc.data模組包含處理資料集對像的工具。這些資料集物件是deepchem的核心。
在機器學習中資料集是資料集合的抽像。我們在此只是展示而不是更深入的解釋。
>>> import deepchem as dc
>>> import numpy as np
>>> n_samples = 50
>>> n_features = 10
>>> x = np.random.rand(n_samples, n_features)
>>> y = np.random.rand(n_samples)
>>> dataset = dc.data.numpydataset(x, y)
>>> dataset.x.shape
(50, 10)
>>> dataset.y.shape
(50,)
這裡我們使用了numpydataset,它是貯存於記憶體的資料集。小對於小型資料集可以工作得很好,很方便實驗,
但是對於大型資料集不太方便。對於大型資料集我們有diskdataset類。
>>> dataset = dc.data.diskdataset.from_numpy(x, y)
>>> dataset.x.shape
(50, 10)
>>> dataset.y.shape
(50,)
這個例子我們沒有指定資料的目錄,因此這個diskdataset存放在臨時資料夾。注意dataset.x和dataset.y
載入自磁碟。因此這對於大型資料集來說代價非常貴。
3.3.2 特徵工程
「featurizer」是轉換原始輸入到經處理的適合機器學習的形式的**塊。dc.feat模組包含大量處理分子、分子複合物和無機晶體的特徵化器。
我們給你展示關於使用特徵化器的例子。
>>> smiles = [
... 'o=cc1ccc(o)c(oc)c1',
... 'cn1ccc[c@h]1c2cccnc2',
... 'c1ccccc1',
... 'c1ccccc1',
... 'cc(=o)o',
... ]
>>> properties = [0.4, -1.5, 3.2, -0.2, 1.7]
>>> featurizer = dc.feat.circularfingerprint(size=1024)
>>> ecfp = featurizer.featurize(smiles)
>>> ecfp.shape
(5, 1024)
>>> dataset = dc.data.numpydataset(x=ecfp, y=np.array(properties))
>>> len(dataset)
5這裡我們使用circularfingerprint並轉換 smiles到ecfp。ecfp是指紋,它是由化學結構資訊組成的向量,我們可用它作為許多模型的輸入。然後,你可能有包含smiles和領儲如homo-lumo gap之類特徵的csv檔案。這種情況,通過使用dataloader,立即可以載入和特徵化資料。
>>> import pandas as pd
>>> # make a dataframe object for creating a csv file
>>> df = pd.dataframe(list(zip(smiles, properties)), columns=["smiles", "property"])
>>> import tempfile
>>> with dc.utils.universalnamedtemporaryfile(mode='w') as tmpfile:
... # dump the csv file
... df.to_csv(tmpfile.name)
... # initizalize the featurizer
... featurizer = dc.feat.circularfingerprint(size=1024)
... # initizalize the dataloader
... loader = dc.data.csvloader(["property"], feature_field="smiles",
featurizer=featurizer)
... # load and featurize the data from the csv file
... dataset = loader.create_dataset(tmpfile.name)
... len(dataset)
53.3.3分割器
dc.splits模組是科學分割器的集合。通常我們需要將原資料分割為訓練集,驗證集,測試集以除錯模型和評估模型的效能。我們將展示分割器的使用。
>>> splitter = dc.splits.randomsplitter()
>>> # split 5 datapoints in the ratio of train:valid:test = 3:1:1
>>> train_dataset, valid_dataset, test_dataset = splitter.train_valid_test_split(
... dataset=dataset, frac_train=0.6, frac_valid=0.2, frac_test=0.2
... )
>>> len(train_dataset)
3>>> len(valid_dataset)
1>>> len(test_dataset)
1這裡,我們用randomsplitter,將資料按訓練:驗證:測試=3:1:1的比例隨機分割。但是隨機分割有時會高估模型的效能,尤其是小型數中不平衡資料。請小心評估模型。
dc.splits提供很多方法和演算法來合適的評估模型的效能,如交叉驗證或使用分子拼接分割。
3.3.4模型訓練和評估
dc.models包含大量的科學應用模型。大部分模型繼承自dc.models.model,我們只需要通過呼叫fit方法來訓練模型。你不用關心使用具體的框架apis。我們將向您展示模型的用法。
>>> from sklearn.ensemble import randomforestregressor
>>> rf = randomforestregressor()
>>> model = dc.models.sklearnmodel(model=rf)
>>> # model training
>>> model.fit(train_dataset)
>>> valid_preds = model.predict(valid_dataset)
>>> valid_preds.shape
(1,)
>>> test_preds = model.predict(test_dataset)
>>> test_preds.shape
(1,)
這裡,我們使用sklearnmodel並訓練模型。即便你要使用tensorflow或pytorch深度學習模型,你只要呼叫fit方法。
然後,如果你使用dc.metrics.metric,你只要呼叫evaluate方法來評估模型。
>>> # initialze the metric
>>> metric = dc.metrics.metric(dc.metrics.mae_score)
>>> # evaluate the model
>>> train_score = model.evaluate(train_dataset, [metric])
>>> valid_score = model.evaluate(valid_dataset, [metric])
>>> test_score = model.evaluate(test_dataset, [metric])
第三章例3 3至例3 10
例3.4 給出三角形的三邊長,求三角形面積 例3.5 求ax 2 bx c 0方程的根.a,b,c由鍵盤輸入。b二次方 4ac 0 例3.6 用 f輸出實數,只能得到6位小數。例3.7 float型資料的有效數字 例3.8 先後輸出boy三個字元 方法一 方法二 例3.9 從鍵盤輸入boy 3個字元...
第三章 堆疊
1.基礎知識 堆疊可以實現很多的應用,遞迴的問題轉化成非遞迴形式,在本質上也是堆疊的問題.它是一種 filo 操作的資料結構,一般也有兩種儲存方式 陣列跟鍊錶實現形式,這裡我給出了鍊錶形式的堆疊模板,裡面包括了基本的堆疊所有的操作,還有兩個比較著名的應用例子,時間倉促,精力比較有限,關於迷宮老鼠還沒...
第三章 曙光
第三章 曙光 第二場校園招聘開始了。其實,洋對這個公司的不是很了解。因為前幾天突然在bbs上面看到了這個公司的招聘資訊,洋覺得這個公司不錯,就上網投了簡歷。接下來的乙個多小時,讓洋很震撼!想不到這個公司這個厲害,而且無論從哪方面來說,絕對不比之前的那個公司差。想不到自己的乙個不經意的決定到了這個大的...