質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.97%

scikitlearnのfitメソッドとndarrayのしがらみからくる見づらいコードをなんとか見やすい方法を考えたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 247

sklearn.linear_model.LogisticRegression¶を利用しています。

以下の全体のコードで下記の点が気になっています。

-  np.reshape(X_train, (-1, 1)),
-  return slope[0], intercept

本当は、以下のようにしたいです。

-  X_train,
-  return slope, intercept


しかし、私の確認に間違いがなければ、scikitlearnのfitメソッドを使っている以上、ndarrayでインプットしndarrayでアウトプットされてしまいます。そのため、上記の記述方法をしています。

他の方は、どのように書いているのか気になります。なにかお気づきの点ありがましたらご教示いただけませんでしょうか?

全体のコード

    logreg_results = [(_id[0], calc(np.reshape(X_train, (-1, 1)), y_train)) for _id, X_train, y_train in zip(_ids, X_train_set, y_train_set)]


def calc(X_train, y_train):
    logreg = LogisticRegression(solver='lbfgs')
    logreg.fit(X_train, y_train)
    slope = logreg.coef_[0]
    intercept = logreg.intercept_[0]

    return slope[0], intercept

ロジスティック回帰でfittingするデータ

(Pdb) X_train
array([[-1.7],
       [-0.7],
       [ 2.8],
       [ 2.8],
       [ 1.9],
       [-1.1],
       [ 1.5],
       [-1.7],
       [ 0.8],
       [-1.7],
       [ 2.3]])
(Pdb) y_train
['0', '0', '0', '1', '0', '1', '0', '0', '1', '0', '0']
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • bamboo-nova

    2019/03/27 22:00

    もしもスッキリしないようであれば、前処理用の関数を定義してreshapeの動作を事前に行うとかでしょうか...汗
    個人的にはパッと見たところ変なところもないですし、これで良いのではないのかなと思ってしまいます。

    キャンセル

  • tiitoi

    2019/03/27 22:38

    まず X_train_set, y_train_set がどのような変数なのかを記載してください。

    キャンセル

  • hayataka2049

    2019/03/28 05:04

    ArrayListはJavaの型、ModelはMVCモデルの一種で、この質問とは関係ないのでタグを外しておいてください。

    キャンセル

  • sequelanonymous

    2019/03/28 10:39

    ご指摘ありがとうございます。追記修正行いました

    キャンセル

回答 1

checkベストアンサー

+1

単なるコメントです。

  • 多クラス分類とか多次元の特徴量になるとロジックが破綻するがいいのか
  • slope = logreg.coef_[0]してるのにreturnのときに更にslope[0]するのも謎
    最初からlogreg.coef_[0,0]とかでいい
  • 正直、特に見づらいとかコードとしておかしいとかは感じません
    (入力フォーマットとの整合性に関しては懸念があるし、これくらいの内容なら使い方次第では関数化しないでlogregの属性から参照することにしてもいいのではという気もするんですが)
  • どちらかというと上の内包表記が・・・
    途中で改行・字下げするとかして80桁未満に抑えるべきです(PEP8に従うなら)
    X_trainy_trainという字面は込み入っているコードだと若干目に優しくないときがあるので(どうしてもtrainの部分が先に見えてしまう)、一時変数ならX,yでいいかな・・・と思ったり。コード見た限りではX_testy_testは登場しないのだし。あ、reshapeする前ならxの方が適当かもしれません
  • np.reshape(X_train, (-1, 1))は書き方が冗長
    下のどちらかで。
X_train.reshape(-1, 1)
X_train[:,np.newaxis]

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/28 15:41

    ありがとうございます。

    > 元のコードのやり方なら自動的に変換してくれますが。
    自動的に変換というのは、どのコードのことでしょうか?

    命名規則周りに関連して以下のような場合は、どう命名するようにしてらっしゃいますか?
    私の場合、二次元配列のlist内包表記を一つのファイルに書くときなどは、内包表記をかくときは、rowとvalueを多様する癖があります。他の方は、どうしてるのだろうか、思った次第です。
    a_ids = [[value[0] for value in row] for row in _ids]
    X_train_set = [[value[1] for value in row] for row in _ids]
    y_train_set = [[value[2] for value in row] for row in _ids]

    キャンセル

  • 2019/03/28 17:54

    >自動的に変換というのは、どのコードのことでしょうか?
    np.reshapeなら勝手にnumpy配列になるというだけの深い意味のないコメントです。

    >命名
    内包表記のスコープの中でだけ有効になるような変数はかなり適当にしていると思います。それこそx,yとかa,bとか。可読性を意識したいときはその都度適当な英単語にする場合もありますが。
    ぶっちゃけ、内包表記の中で凝った長い変数名を付けるほうが可読性下がるんじゃ・・・とか思ったり。
    本気で気にするのは外側の変数名です。たとえばX_train_setという変数名など、「ん、set型?」とか紛らわしい要素があるので、理想を言えば使わないほうがいいです。

    キャンセル

  • 2019/03/28 18:54

    > 本気で気にするのは外側の変数名です。たとえばX_train_setという変数名など、「ん、set型?」とか紛らわしい要素があるので、

    確かにそうですね、気づきませんでした。ありがとうございます。名前こりすぎて逆に他の人にとっては可読性は低く見えるというのは大いにありえそうですね。短め適当っていう感覚でやっていきます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.97%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる
  • トップ
  • Modelに関する質問
  • scikitlearnのfitメソッドとndarrayのしがらみからくる見づらいコードをなんとか見やすい方法を考えたい