この記事はまだ書きかけです.

はじめに

バイオイフォマティクスの分野でよく分析対象とされるマイクロアレイ・データを,生物学からではなくデータ・マイニングからの視点で解析してみます.

目的がないとやりにくいので,ここでは,RSCTC 2010データ・マイニング・コンテストで課題となったタスクを用います.

RSCTC 2010データ・マイニング・コンテスト

2010年6月にポーランドで行われたラフ集合国際会議RSCTC 2010で行われたデータ・マイニング・コンテストであり,テーマはマイクロアレイ・データ解析です.

Basic TrackとAdvanced Trakの2部門があり,ここではBasic Trackを対象とします.

DNAマイクロアレイ・データ

microarray.gif

DNAマイクロアレイ・データは,遺伝子(DNA)の発現量を記録したデータです.

DNAはRNAに転写され,RNAがたんぱく質に翻訳されます. このときの転写パターンを表すmRNAのレベルを測定したものです.

たとえば,正常細胞のDNAを緑色の蛍光色素で,がん細胞のDNAを赤色の蛍光色素で標識しておき,DNAごとにこれを混ぜて発現させ,蛍光シグナルの比を調べます. すると,緑色のスポットは正常細胞のみで発現しているDNA,赤色のスポットはがん細胞のみで発現しているDNAだということがわかります..

右の画像はRSCTC 2010データ・マイニング・コンテストのサイトから引用したもので,発現した蛍光シグナルをスキャンした画像のイメージです.

データ・マイニングから見たときのマイクロアレイ・データの特徴は,説明変数が多く,事例数が少ないということです. マイクロアレイ分析では,一度にたくさんのDNAを分析できるので,説明変数が多いです. しかし,がん細胞の提供者をたくさん集めることはできないので,事例数は少ないです.

データのダウンロード

data-csv.zipをダウンロードします. ダウンロードするには,TunedITへの登録が必要です. 登録は無料ですぐにできます.

data-arff.zipはデータ・マイニング・ツールキットWEKA用のファイルです.

データ

data-csv.zipには,訓練データとテスト・データが6つずつ含まれています.

訓練データdata1_train.csvには123個の事例が含まれており,データ1つにつき54,675個の説明変数と1つのラベルが付いています. ラベルは1または2となっています.

全体としては,事例数は100から400,説明変数の数は20,000から65,000,ラベルの数は2から10となっています.

data1_train.csvの最初の10個の事例について,最初の10個の説明変数とラベルを抜き出すと次のようになります.

% head -11 data1_train.csv | cut -d, -f1-10,54676
Var1,Var2,Var3,Var4,Var5,Var6,Var7,Var8,Var9,Var10,Decision
3.116,2.004,2.22,2.144,1.665,4.161,3.112,2.076,1.927,6.411,1
3.105,1.914,2.286,1.924,1.62,4.198,3.071,2.214,1.98,6.49,2
3.203,1.732,2.369,1.993,1.614,4.424,3.055,2.466,2.057,6.592,2
3.198,1.721,2.405,2.17,1.524,4.538,3.038,2.239,1.917,6.583,2
2.99,1.866,2.359,1.832,1.716,4.099,3.169,2.086,2.07,6.351,1
3.341,2.015,2.364,1.95,1.729,4.111,3.238,2.058,2.09,6.504,1
3.228,1.615,2.319,1.918,1.567,4.431,3.256,2.002,1.964,6.657,1
3.111,2.079,2.468,1.942,1.588,4.001,3.453,1.889,2.225,6.618,1
3.268,2.064,2.284,2.359,1.614,4.227,3.258,2.243,2.101,6.61,1
3.13,2.205,2.188,1.88,1.579,4.123,3.2,2.075,2.134,6.503,1

SVMによる学習と予測

ここでは,サポート・ベクター・マシン(SVM)を用いて,データの説明変数からラベルを予測するモデルを学習します. SVMには,定番ツールの一つであるSVM-Lightを用います.

SVM-Lightへの入力ファイルは,次のような形でないといけません.

ラベル 属性番号:値 属性番号:値 ...

また,ラベルは,正事例が「+1」,負事例が「-1」となります.

そこで,次のようなRuby 1.9用のプログラムを作成し,data1_train.csvをSVM-light用のデータに変換します.

require "csv"

csvfile = ARGV[0]  # CSVファイルの名前

reader = CSV.open(csvfile, 'r')
reader.shift  # ヘッダ行をスキップ
reader.each do |row|
  # ラベル
  if row[row.size-1].to_i == 1 then
    print "+1 "
  else
    print "-1 "
  end

  # 説明変数
  (row.size - 1).times do |i|
    print "#{i+1}:#{row[i]} "
  end
  print "\n"
end

すると,次のようなファイルになります. (ラベルと最初の10個の説明変数だけを表示しています.)

% ruby RSCTC.rb train1_train.csv > data1_train.svm-light
% head -10 data1_train.svm-light | cut -d' ' -f1-11
+1 1:3.116 2:2.004 3:2.22 4:2.144 5:1.665 6:4.161 7:3.112 8:2.076 9:1.927 10:6.411
-1 1:3.105 2:1.914 3:2.286 4:1.924 5:1.62 6:4.198 7:3.071 8:2.214 9:1.98 10:6.49
-1 1:3.203 2:1.732 3:2.369 4:1.993 5:1.614 6:4.424 7:3.055 8:2.466 9:2.057 10:6.592
-1 1:3.198 2:1.721 3:2.405 4:2.17 5:1.524 6:4.538 7:3.038 8:2.239 9:1.917 10:6.583
+1 1:2.99 2:1.866 3:2.359 4:1.832 5:1.716 6:4.099 7:3.169 8:2.086 9:2.07 10:6.351
+1 1:3.341 2:2.015 3:2.364 4:1.95 5:1.729 6:4.111 7:3.238 8:2.058 9:2.09 10:6.504
+1 1:3.228 2:1.615 3:2.319 4:1.918 5:1.567 6:4.431 7:3.256 8:2.002 9:1.964 10:6.657
+1 1:3.111 2:2.079 3:2.468 4:1.942 5:1.588 6:4.001 7:3.453 8:1.889 9:2.225 10:6.618
+1 1:3.268 2:2.064 3:2.284 4:2.359 5:1.614 6:4.227 7:3.258 8:2.243 9:2.101 10:6.61
+1 1:3.13 2:2.205 3:2.188 4:1.88 5:1.579 6:4.123 7:3.2 8:2.075 9:2.134 10:6.503

最後に,SVMに訓練データを入力して予測モデルを学習します. ここでは,説明を簡単にするため,線形SVMを用い,Leave-One-Out交差検定を用いて評価します.

% svm_learn -x 1 data1_train.svm-light 
Scanning examples...done
Reading examples into memory...100..OK. (123 examples read)
Setting default regularization parameter C=0.0000
Optimizing............done. (13 iterations)
Optimization finished (35 misclassified, maxdiff=0.00084).
Runtime in cpu-seconds: 0.36
Number of SV: 74 (including 66 at upper bound)
L1 loss: loss=69.03961
Norm of weight vector: |w|=0.00134
Norm of longest example vector: |x|=737.09503
Estimated VCdim of classifier: VCdim<=1.98110
Computing XiAlpha-estimates...done
Runtime for XiAlpha-estimates in cpu-seconds: 0.01
XiAlpha-estimate of the error: error<=54.47% (rho=1.00,depth=0)
XiAlpha-estimate of the recall: recall=>63.64% (rho=1.00,depth=0)
XiAlpha-estimate of the precision: precision=>61.54% (rho=1.00,depth=0)
Number of kernel evaluations: 2112
Computing leave-one-out+---(?[4]..+)(?[5]..+)(?[6]..+)++++(?[11]..+)+-(?[14]...+)(?[15]..+)-(?[17]..+)(?[18]..+)-+-(?[22]..+)++-(?[26]..+)+-+-++--(?[35]..+)++(?[38]..+)-+(?[41]..+)+++(?[45]..+)--+-(?[50]..+)-++++++(?[58]..+)---++++-++-(?[70]..+)(?[71]...+)+(?[73]...+)-(?[75]..+)(?[76]..+)+-(?[79]..+)+--+++-(?[87]..+)(?[88]...+)++-++(?[94]....+)+(?[96]...+)(?[97]...+)(?[98]...+)+--+(?[103]...+)+++-+(?[109]..+)+++-(?[114]..+)+-++-(?[120]..+)-+
Retrain on full problem.done.
Leave-one-out estimate of the error: error=28.46%
Leave-one-out estimate of the recall: recall=100.00%
Leave-one-out estimate of the precision: precision=71.54%
Actual leave-one-outs computed:  32 (rho=1.00)
Runtime for leave-one-out in cpu-seconds: 1.79
Writing model file...done

予測エラーが28.46%で学習できたように見えますが,実は全ての事例に対して正事例であると予測しているので,学習した予測モデルは良いものではありません.

これで終わりにするわけにはいかないのですが,まずはここまで. 続きはまたいつか.

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS