DataFlame.sampleを実行するとインデックスに関するエラーが発生
「初めてのTensorFlow.js」を読み、Danfo.jsを使ってタイタニックのデータ加工に挑戦しました。
2023年11月に購入したのですが、初版(2022年6月27日)の書物ということもあるのか、
Danfo.jsの仕様がだいぶ変更してしまっているようで、Danfo.jsの公式サイトを見ながら四苦八苦しています。
DataFlameをdropNan(空の列を含む行を削除)した後に、
sample(ランダムにサンプリング)をしたところ下記のようなエラーが出てしまいうまくいかなかったので記録に残します。
Error: Invalid row parameter: Specified index 1109 cannot be bigger than index length 1043
実行したコードは下記”①エラーが出てsampleできないコード”です。
sumple( 800 )と800行をサンプリングしようとしているのに、
「エラー: 行パラメータが無効です: 指定されたインデックス 1109 はインデックス長 1043 より大きくすることはできません」
1109番のインデックスを指定してしまっているとエラー出力されてしまいます。
①エラーが出てsampleできないコード
const dfd = require("./node_modules/danfojs-node");
async function ProcessAndExportData() {
// 訓練用データとテスト用データの読込
const df_1 = await dfd.readCSV( "./titanic_data/train.csv" );
const df_2 = await dfd.readCSV( "./titanic_data/test.csv" );
// データを結合
const df_1_2 = dfd.concat( { dfList: [ df_1 , df_2 ] , axis: 0 } );
// データを加工
// いくつかの列を削除
df_1_2.drop( { columns: [ "Name" , "PassengerId" , "Ticket" , "Cabin" ] , inplace: true } );
// 空の列がある行を削除
const onlyFull = df_1_2.dropNa();
// Embarked を数値にエンコード
const encode = new dfd.LabelEncoder();
encode.fit( onlyFull["Embarked"] );
onlyFull["Embarked"] = encode.transform( onlyFull["Embarked"].values );
// Sex を数値にエンコード
encode.fit( onlyFull["Sex"] );
onlyFull["Sex"] = encode.transform( onlyFull["Sex"].values );
// 結合したデータをチェック
onlyFull.describe().print();
console.log( onlyFull.shape[ 0 ] );
// 新たな訓練用データをランダムに抽出
const newDf_1 = await onlyFull.sample( 800 );
// newDf_1に含まれないデータをテスト用データに
const newDf_2 = onlyFull.drop( { index:newDf_1.index , axis: 0 })
// CSVファイルに書き出す
dfd.toCSV( newDf_1 , { filePath: "./titanic_data/newTrain.csv" } );
dfd.toCSV( newDf_2 , { filePath: "./titanic_data/newTest.csv" } );
}
ProcessAndExportData();
dropNa(空行を含む行を削除)した後は、resetIndex(インデックスのリセット)をしないと、
正常にsample(ランダムにサンプリング)できないようでした。
下記”②正しいコード”のように、sampleする前にresetIndexを実行しましょう。
サイト上で使える画像色変更ツール【透過・塗りつぶしもできる】
ブラウザ上にて無料で使えるツールです。画像全体を対象に特定の色を選択し置換。領域内を対象に色の塗りつぶし。透過もできる。近似色も対象に色変換を実行することができます。
②正しいコード(resetIndexを追記)
const dfd = require("./node_modules/danfojs-node");
async function ProcessAndExportData() {
// 訓練用データとテスト用データの読込
const df_1 = await dfd.readCSV( "./titanic_data/train.csv" );
const df_2 = await dfd.readCSV( "./titanic_data/test.csv" );
// データを結合
const df_1_2 = dfd.concat( { dfList: [ df_1 , df_2 ] , axis: 0 } );
// データを加工
// いくつかの列を削除
df_1_2.drop( { columns: [ "Name" , "PassengerId" , "Ticket" , "Cabin" ] , inplace: true } );
// 空の列がある行を削除
const onlyFull = df_1_2.dropNa();
// Embarked を数値にエンコード
const encode = new dfd.LabelEncoder();
encode.fit( onlyFull["Embarked"] );
onlyFull["Embarked"] = encode.transform( onlyFull["Embarked"].values );
// Sex を数値にエンコード
encode.fit( onlyFull["Sex"] );
onlyFull["Sex"] = encode.transform( onlyFull["Sex"].values );
// 結合したデータをチェック
onlyFull.describe().print();
console.log( onlyFull.shape[ 0 ] );
// インデックスをリセット
onlyFull.resetIndex( { inplace: true } );
// 新たな訓練用データをランダムに抽出
const newDf_1 = await onlyFull.sample( 800 );
// newDf_1に含まれないデータをテスト用データに
const newDf_2 = onlyFull.drop( { index:newDf_1.index , axis: 0 })
// CSVファイルに書き出す
dfd.toCSV( newDf_1 , { filePath: "./titanic_data/newTrain.csv" } );
dfd.toCSV( newDf_2 , { filePath: "./titanic_data/newTest.csv" } );
}
ProcessAndExportData();
コメント