最近機械学習を始めたのですが困ったことが多々あった(ある)のでその解決法などを随時書いていこうと思います。
また、こんなことに困ってこう解決した!や私の解決法よりももっと便利なイイ方法があるという方はぜひ教えていただけると幸いです。
目次
1.read_csvのオプション
2.NaN以外の欠損値の置き換え法
3.データの中の項目の型変更
4.実際にテストした際に困った点
5.データの精度を向上させる
1.read_csvのオプション
私は今signateで勉強をし始めたのですが、そのデータの形は.tsvでした。
いつも通りの下記のような方法で読み込みをすると
sample = pd.read_csv('train.tsv')
のような形になってしまい、収まりがつきません。
データを見るとわかるのですが、"\t"というもので区切られているのがわかるので、オプションの sep=""を使い、区切りを認識してあげると良いです。
今回は、以下の文をすることで正しい形にすることができました。
sample = pd.read_csv('train.tsv',sep="\t")
また、いろいろなオプションがあるので自分のデータにあっている方法を使うと良いと思います。
https://note.nkmk.me/python-pandas-read-csv-tsv/
などを参考にさせていただきました。
2.NaN以外の欠損値の置き換え法
先程のデータと比べ合わせてみて欲しいのですが、なぜかhorsepowerの項目がfloatではなく、object型として認識されています。
これでは、describe()とかを使ってもうまく表示されません。そこで原因を探します。
データを見てみると、horsepowerの項目のデータに"?"という文字があります。これのおかげでおそらく変な型になっているのだと思います。
今回はこれを欠損値NaNに変更しようと思います。
#データを確認して"?"をNaNに変換
sample = sample.replace("?", np.nan)
をしてあげると
となり、うまく欠損値を”?”に変更することができました。
3.データの中の項目の型変更
上記で、うまくデータを欠損地に当てはめることができましたが、まだデータの型がobjectのままです。
なのでこれをうまいこと変更してあげなければなりません。
データの型を変更するには以下のようにしました。
sample["項目名"] = sample["項目名"].astype(np.変更したい型)
これでdescribeで概要等を確認することができました。
4.実際にテストした際に困った点(2021/09.30追記)
テスト用データにも訓練データと同じような処理をしてあげるのですが、今回私は"?"データの行を除外するという処理をしていたため、テスト用のデータの出力の数が少なくなってしまいました。
これでは提出できないので、"?"のデータを平均値や中央値、(もしくは?データを同じように機械学習してその値を当てはめるとか・・?)で補う必要があります。
ですので今回は
のようにして補いました。
この方法だとどんな値でも適当に中央値が与えられてしまい、機械学習に悪い影響を与えてしまうと思っているので改善したいと考えています。
5.データの精度の向上の試行(2021/09.30追記)
SIGNATEの1つ目の講座には主に2つのデータ精度の向上のための方法が載っていたのでその方法を試しています。
今回出場したコンペティションはこちらです。
1つ目はデータをダミー変数化するということです。
今回のデータセットで言うとcar nameというのがあり、その項目にある法則があるのでそれをダミー変数貸してあげます。
2つ目は対数化です。
df['追加する項目']= np.log(df['対数化する項目'])
で対数化することができます。
なぜ精度が向上するのかはSIGNATEの講座内で語られているので受講したり調べてみたりしてください。
この方法で少しだけ精度を向上することができました。
現在ではこれだけですがこれからわからないことがあれば随時追加していこうと思います。