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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

解決済

1回答

1416閲覧

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

sequelanonymous

総合スコア123

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2019/03/27 12:47

編集2019/03/28 01:38

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

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

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

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

- X_train, - return slope, intercept

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

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

全体のコード

python

1 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)] 2 3 4def calc(X_train, y_train): 5 logreg = LogisticRegression(solver='lbfgs') 6 logreg.fit(X_train, y_train) 7 slope = logreg.coef_[0] 8 intercept = logreg.intercept_[0] 9 10 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']

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bamboo-nova

2019/03/27 13:00

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

2019/03/27 13:38

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

2019/03/27 20:04

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

2019/03/28 01:39

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

回答1

0

ベストアンサー

単なるコメントです。

  • 多クラス分類とか多次元の特徴量になるとロジックが破綻するがいいのか
  • slope = logreg.coef_[0]してるのにreturnのときに更にslope[0]するのも謎

最初からlogreg.coef_[0,0]とかでいい

  • 正直、特に見づらいとかコードとしておかしいとかは感じません

(入力フォーマットとの整合性に関しては懸念があるし、これくらいの内容なら使い方次第では関数化しないでlogregの属性から参照することにしてもいいのではという気もするんですが)

  • どちらかというと上の内包表記が・・・

途中で改行・字下げするとかして80桁未満に抑えるべきです(PEP8に従うなら)
X_train, y_trainという字面は込み入っているコードだと若干目に優しくないときがあるので(どうしてもtrainの部分が先に見えてしまう)、一時変数ならX,yでいいかな・・・と思ったり。コード見た限りではX_testy_testは登場しないのだし。あ、reshapeする前ならxの方が適当かもしれません

  • np.reshape(X_train, (-1, 1))は書き方が冗長

下のどちらかで。

python

1X_train.reshape(-1, 1) 2X_train[:,np.newaxis]

投稿2019/03/27 20:02

編集2019/03/27 20:07
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sequelanonymous

2019/03/28 01:48

ご指摘ありがとうございます。全てとても参考になります。自分がまだまだ不勉強だなと感じました。 三点だけご確認させてください。 - Xかxかの違い、もしくは使い分けは自分で調べていて気になっていました。どう使い分けしていくのでしょうか? - 現状、X_trainはリストで渡していますのでX_train.reshape(-1, 1)を書こうとすると、X_trainをndarray に変換しておくとかが事前に必要という理解であっていますでしょうか?(エラー: AttributeError: 'list' object has no attribute 'reshape') - 入力フォーマットとの整合性に関しては懸念について気になります。もう少しご教示いただけませんでしょうか?
hayataka2049

2019/03/28 02:18 編集

>Xとx 私も正確な使い分けは把握していませんが、概ねの傾向としては一次元配列なら小文字、二次元配列なら大文字という気がします。正しいかどうかはちょっと怪しいですが。 >AttributeError リストならしょうがないですね。元のコードのやり方なら自動的に変換してくれますが。 >入力フォーマットとの整合性 説明変数が常に1つであるなら構いませんが、そうでなければcoef_[0,0]だけとっても意味がありません。また、目的変数が3クラス以上でも同様です。
sequelanonymous

2019/03/28 06: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]
hayataka2049

2019/03/28 08:54

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

2019/03/28 09:54

> 本気で気にするのは外側の変数名です。たとえばX_train_setという変数名など、「ん、set型?」とか紛らわしい要素があるので、 確かにそうですね、気づきませんでした。ありがとうございます。名前こりすぎて逆に他の人にとっては可読性は低く見えるというのは大いにありえそうですね。短め適当っていう感覚でやっていきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問