データフレームからテンソルを作成 (gota)

このハウツーでは、gotaを使用してデータフレームからテンソルを作成する方法を説明します。 The goal is to read a csv file and create a *tensor.Dense with shape (2,2). ゴールは、csvファイルを読み取り、(2,2) のシェイプの* tensor.Denseを作成することです。

csvファイルからデータフレームを作成する

以下のコンテンツのcsvファイルを考えます:

sepal_length,sepal_width,petal_length,petal_width,species
5.1         ,3.5        ,1.4         ,0.2        ,setosa
4.9         ,3.0        ,1.4         ,0.2        ,setosa
4.7         ,3.2        ,1.3         ,0.2        ,setosa
4.6         ,3.1        ,1.5         ,0.2        ,setosa
5.0         ,3.6        ,1.4         ,0.2        ,setosa
...

これはIris flower data setからの抜粋です。 データセットのコピーはここから見つける事ができます。

種別以外のすべての値を含むテンソルを作成します。

gotaを使用してデータフレームを作成する

gotaのデータフレームパッケージにはio.Readerを引数として取る関数ReadCSVがあります。

f, err := os.Open("iris.csv")
if err != nil {
    log.Fatal(err)
}
defer f.Close()
df := dataframe.ReadCSV(f)

dfがファイルに存在する全てのデータが含まれるDataFrameです。

gotaはデータフレームの列を参照する為にCSVの最初の行を使用します。

種別(species)カラムを削除しましょう:

xDF := df.Drop("species")

データフレームを行列に変換する

物事を簡単にするために、データフレームをgonumで定義されているMatrixに変換します(matrixのgodocを参照)。 matrixはインタフェースです。gotaのデータフレームはMatrixインターフェイスを満たしません。gotaのドキュメントに記載されているように、 Matrixインターフェイスを満たすために、データフレームのラッパーを作成します。

type matrix struct {
	dataframe.DataFrame
}

func (m matrix) At(i, j int) float64 {
	return m.Elem(i, j).Float()
}

func (m matrix) T() mat.Matrix {
	return mat.Transpose{Matrix: m}
}

テンソルを作る

データフレームをmatrix構造体の中にラッピングすると関数tensor.FromMat64のおかげで*Denseテンソルを作成できるようになります。

xT := tensor.FromMat64(mat.DenseCopyOf(&matrix{xDF}))