網頁

2019年8月13日 星期二

Machine Learning Summer School

https://sites.google.com/view/mlss-2019/lectures-and-tutorials?fbclid=IwAR37Ng8Vi5kfjcFsVTSWSw_7BteSktcK-xm6QsLO-ICdGtDkgEQYZga2uDo

Speed Up Your Python Code with Cython

https://morioh.com/p/f328ce3f15ae?fbclid=IwAR1vphPzNvQEk4MmppHvOUp9J-FMWifV5XQ-WcD8OnIC5BrPniMuf5-hUmE

理解LSTM在keras API中參數return_sequences和return_state

https://stackabuse.com/solving-sequence-problems-with-lstm-in-keras/
https://blog.csdn.net/u011327333/article/details/78501054
https://www.twblogs.net/a/5c996675bd9eee434fc6a446
http://philipperemy.github.io/keras-stateful-lstm/


one-to-many有問題
https://medium.com/@daniel820710/%E5%88%A9%E7%94%A8keras%E5%BB%BA%E6%A7%8Blstm%E6%A8%A1%E5%9E%8B-%E4%BB%A5stock-prediction-%E7%82%BA%E4%BE%8B-1-67456e0a0b

Keras之stateful LSTM全面解析+實例測試

https://zhuanlan.zhihu.com/p/34495801

使用sklearn進行數據預處理之Binarizer,LabelEncoder,LabelBinarizer,OneHotEncoder

https://blog.csdn.net/u013019431/article/details/80009545

Batch Normalization

http://violin-tao.blogspot.com/2018/02/ml-batch-normalization.html

2019年8月11日 星期日

【工程師實用外掛】開啟 Cython,讓你的 Python 運算速度提升 36 倍!

https://buzzorange.com/techorange/2019/08/05/cython-raise-speed-of-python/?fbclid=IwAR2Ta8i4SQ0VtNTmP5uKz3VJMroyXOLedWTFW4P4wVw5HEV9IZKA4viScaY

Keras Learning Rate Finder

https://www.pyimagesearch.com/2019/08/05/keras-learning-rate-finder/?fbclid=IwAR2wYsn11biYQgnzk8zAWCeUjfmzFDfuHOGFIcjnuODOmwuci0rR7xgDNck

Image Classification using Deep Learning & PyTorch: A Case Study with Flower Image Data

https://medium.com/towards-artificial-intelligence/image-classification-using-deep-learning-pytorch-a-case-study-with-flower-image-data-80a18554df63

Explore Markov Chains With Examples — Markov Chains With Python

https://medium.com/edureka/introduction-to-markov-chains-c6cb4bcd5723

Understanding Convolutional Neural Networks for NLP

http://www.wildml.com/2015/11/understanding-convolutional-neural-networks-for-nlp/?fbclid=IwAR0H3jY95mPYHQQfbleZxv-8RRJi85pHqFnhD8J718bBhhZcouWCTOAozOY

在PyTorch上用「Keras」,分佈式訓練開箱即用,告別沒完沒了的Debug

https://bangqu.com/6y23jB.html

CNN的平移不變性回來了,ImageNet準確度還提升了:Adobe開源新方法,登上ICML

https://bangqu.com/49Shk9.html

2019年8月2日 星期五

理解LSTM(Long Short-Term Memory,LSTM)網絡

https://www.cnblogs.com/wangduo/p/6773601.html

Recurrent Neural Networks and LSTM explained

在這篇文章中,我們將探索RNN和LSTM

循環神經網絡是第一種同類最先進的演算法,當給出大量的序列數據時,它能夠記憶/記住之前的輸入在記憶體中。

機器學習- 神經網路(多層感知機 Multilayer perceptron, MLP) 含倒傳遞( Backward propagation)詳細推導

https://medium.com/@chih.sheng.huang821/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-%E7%A5%9E%E7%B6%93%E7%B6%B2%E8%B7%AF-%E5%A4%9A%E5%B1%A4%E6%84%9F%E7%9F%A5%E6%A9%9F-multilayer-perceptron-mlp-%E5%90%AB%E8%A9%B3%E7%B4%B0%E6%8E%A8%E5%B0%8E-ee4f3d5d1b41

遞歸神經網路(Recurrent Neural Network): Back-propagation Through Time

https://medium.com/@chih.sheng.huang821/%E9%81%9E%E6%AD%B8%E7%A5%9E%E7%B6%93%E7%B6%B2%E8%B7%AF-recurrent-neural-network-back-propagation-through-time-8d49ebf04b77

2019年8月1日 星期四

A detailed example of how to use data generators with Keras

Motivation
你是否曾經加載一個需要消耗大量記憶體的數據集,讓你希望有一個神奇的技巧可以無縫地處理它? 隨著我們能夠利用不斷增長的數據量,大型數據集正日益成為我們生活的一部分。

我們必須記住,在某些情況下,即使是最先進的配置也沒有足夠的內存空間來處理數據,就像我們過去那樣。 這就是為什麼我們需要找到其他方法來有效地完成這項任務的原因。 在這篇部落格中,我們將向您展示如何在多個核心上實時生成數據集,並立即將其提供給您的深度學習模型。


本教程中使用的框架是Python的高級軟件包Keras提供的框架,可以在TensorFlow或Theano的GPU安裝之上使用。

Python Applications – 9 Real World Applications of Python Programming

https://data-flair.training/blogs/python-applications/?fbclid=IwAR22bW-x8SS7mNiOLFLmvxJ79fOt4h3yblMt0NvFRwzh8ZT3qX_L9JnV0RU

Protein Sequence Classification2

Introduction

Background
該數據集由許多不同類型的大分子組成,這些大分子具有生物意義。大多數數據記錄都是蛋白質。 DNA是RNA的前體,當轉錄時,蛋白質是在生物途徑和循環中直接相互作用的生物分子。蛋白質通常以一個或幾個工作為中心,這個工作由其家族類型定義。例如,我們可以使用來自水解酶組的蛋白質,其專注於催化水解(通過添加水來破壞鍵)以幫助促進蛋白質鍊或其他分子的鏈的破壞。另一個例子是作為載體蛋白的蛋白質,其允許其他分子如蔗糖,果糖或甚至水進入細胞內外。

Goals
由於這些蛋白質具有不同的家族類型,如果可以基於序列確定蛋白質的家族類型,則會出現問題。有一些著名的搜索引擎如BLAST具有這種能力,但如果機器學習方法可以根據蛋白質序列很好地對蛋白質家族進行分類是很有趣的。

1). Import Dataset
首先,加載函式庫和數據集。由於序列是一種字符串,這似乎是嘗試使用CountVectorizer的好機會。CountVectorizer是與NLP機器學習模型一起使用的特徵提取器(feature extractor)。

# 1). ----- Import Libraries and Datasets ------

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report


# Import Datasets
df_seq = pd.read_csv('../input/pdb_data_seq.csv')
df_char = pd.read_csv('../input/pdb_data_no_dups.csv')

print('Datasets have been loaded...')


2) Filter and Process Data
將數據加載到兩個單獨的pandas dataframes中,必須執行過濾器,項目和連接以將數據組合在一起。 這裡有一種好的函式庫dfply用來檢查,類似於R的dplyr函式庫。儘管如此,pandas提供了一種執行這些類似SQL的命令的方法。 首先過濾分類等於'蛋白質'的數據集,然後除去所有其他變量,除了pdb_data_seq.csv的structureId和classification以及pdb_data_no_dups.csv數據集中的structureId和sequence。

# 2). ----- Filter and Process Dataset ------

# Filter for only proteins
protein_char = df_char[df_char.macromoleculeType == 'Protein']
protein_seq = df_seq[df_seq.macromoleculeType == 'Protein']

# Select only necessary variables to join
protein_char = protein_char[['structureId','classification']]
protein_seq = protein_seq[['structureId','sequence']]
protein_seq.head()


protein_char.head()


protein_seq正確包含蛋白質,因為不同的序列以Methoinine開頭,以及包含比'ACTG'更多的字母的序列。 我們現在可以使用structureId作為索引來執行連接。 我們將使用pandas 'join' 方法。 為此,我們必須將每個dataframe的索引設置為“structureId”。

# Join two datasets on structureId
model_f = protein_char.set_index('structureId').join(protein_seq.set_index('structureId'))
model_f.head()


print('%d is the number of rows in the joined dataset' %model_f.shape[0])


這兩個dataframes正式加入了一個擁有346,325個蛋白質。 數據處理尚未完成,因為查看與columns關聯的mising是很重要的。

# Check NA counts
model_f.isnull().sum()


使用346,325種蛋白質,似乎只需刪除缺失值即可。

# Drop rows with missing values
model_f = model_f.dropna()
print('%d is the number of proteins that have a classification and sequence' %model_f.shape[0])


最後,重要的是要看一下分類的家庭群體的類型。

# Look at classification type counts
counts = model_f.classification.value_counts()
print(counts)

#plot counts
plt.figure()
sns.distplot(counts, hist = False, color = 'purple')
plt.title('Count Distribution for Family Types')
plt.ylabel('% of records')
plt.show()



家庭類型的數量似乎有很多分佈。 過濾具有特定家庭類型的一定數量的記錄可能是個好主意。 1,000似乎是一個可靠的數字,它允許機器學習模型學習特定類的模式。

# Get classification types where counts are over 1000
types = np.asarray(counts[(counts > 1000)].index)

# Filter dataset's records for classification types > 1000
data = model_f[model_f.classification.isin(types)]

print(types)
print('%d is the number of records in the final filtered dataset' %data.shape[0])


3). Train Test Split
在最終過濾數據集之後,必須對數據進行拆分以創建訓練和測試集。分割數據後,利用CountVectorizer創建由訓練數據集組成的字典非常重要。這將提取單個字符或字符子集以獲得特徵。關於使用CountVectorizer的一個重要注意事項是ngram_range的規範。

在蛋白質中,蛋白質中不是單個氨基酸可以識別它的目的。它是經由序列中氨基酸鍵形成的二級和三級結構。此外,鏈以及氨基酸的不同指出使用大於一個單元的特徵是重要的。因此,使用(4,4)的ngram_range似乎是特徵提取的合法選擇。這將提取長度為4的不同子集,允許氨基酸使用其鄰居來幫助我們進行分類。

# 3). ----- Train Test Split -----

# Split Data
X_train, X_test,y_train,y_test = train_test_split(data['sequence'], data['classification'], test_size = 0.2, random_state = 1)

# Create a Count Vectorizer to gather the unique elements in sequence
vect = CountVectorizer(analyzer = 'char_wb', ngram_range = (4,4))

# Fit and Transform CountVectorizer
vect.fit(X_train)
X_train_df = vect.transform(X_train)
X_test_df = vect.transform(X_test)

#Print a few of the features
print(vect.get_feature_names()[-20:])


4). Machine Learning Models
通過提取的功能,是時候使用機器學習模型了。 傳統上,樸素貝葉斯(Naive Bayes)方法適用於這些類型的計數向量化特徵(count vectorized features)。 Adaboost也將用來比較。

# 4). ------ Machine Learning Models ------

# Make a prediction dictionary to store accuracys
prediction = dict()

# Naive Bayes Model
from sklearn.naive_bayes import MultinomialNB
model = MultinomialNB()
model.fit(X_train_df, y_train)
NB_pred = model.predict(X_test_df)
prediction["MultinomialNB"] = accuracy_score(NB_pred, y_test)
print( prediction['MultinomialNB'])


# Adaboost
from sklearn.ensemble import AdaBoostClassifier
model = AdaBoostClassifier()
model.fit(X_train_df,y_train)
ADA_pred = model.predict(X_test_df)
prediction["Adaboost"] = accuracy_score(ADA_pred , y_test)
print(prediction["Adaboost"])


5). Visualize Metrics
似乎Naive Bayes在分類方面比Adaboost更好。 混淆矩陣的可視化和Navie Bayes預測的分類可以幫忙告訴我們模型表現是否不佳。

# 5). ----- Plot Confusion Matrix for NB -----

# Plot confusion matrix
conf_mat = confusion_matrix(y_test, NB_pred, labels = types)

#Normalize confusion_matrix
conf_mat = conf_mat.astype('float')/ conf_mat.sum(axis=1)[:, np.newaxis]

# Plot Heat Map
fig , ax = plt.subplots()
fig.set_size_inches(13, 8)
sns.heatmap(conf_mat)


混淆矩陣顯示標籤索引3被錯誤地分類為索引38。 根據下面列出的名稱,將這兩者混淆是有道理的。

print(types[3])
print(types[38])


最後,分類報告的矩陣顯示每個類的案例指標應該是富有洞察力的

#Print F1 score metrics
print(classification_report(y_test, NB_pred, target_names = types))

Reasons for Model Error
蛋白質通常可以是一種酶,或信號蛋白,結構和各種其他選擇。一小部分蛋白質傾向於具有非常相似的特徵,因為一些蛋白質與其他蛋白質結合在相似的區域中。例如,水解酶和水解酶抑製劑蛋白將具有相似的結構,因為它們將靶向非常相似的區域。這反映在混淆矩陣和熱圖(heat map)中。基因調節蛋白(Gene regulator proteins)與RNA結合蛋白,DNA結合蛋白以及轉錄蛋白具有相似性。最重要的是要注意,因為該模型最多只使用4種氨基酸的特徵。在理論上使用更高程度氨基酸的可能性應該能夠產生更高的準確度。

Future Work
該模型肯定有改進的餘地。利用諸如pH,分子量和其他組成的因素可能能夠產生關於家族群的更多信息。此外,如果可能的話,增加ngram_range的長度以包含超過4個字符,以允許氨基酸之間更高的相互作用,如現實中所反映的



參考
https://www.kaggle.com/abharg16/predicting-protein-classification