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

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

新規登録して質問してみよう
ただいま回答率
85.35%
scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

1243閲覧

selfを返すとは?

cunwe

総合スコア65

scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/01 03:12

はじめに

具体的なエラーが出てるわけではないです。

質問

オライリー出版の『Pythonではじめる機械学習』の67ページに以下のような記載があります。下に記載したlogregの式ですが、fitメソッドがselfを返さないとどういう式になるのでしょうか?また__init__とfitを続けて書くとありますが、コードに__init__が現れておらずこの辺の仕組みがこちらの記事を読んでもあまり理解できないのですがどなたかご教授いただけますでしょうか?よろしくお願いいたします。

以下、抜粋 

すべてのscikit-learnモデルのfitメソッドはselfを返す。これによって既に本章で何度も登場している、次のような書き方が可能になる。
logreg = LogisticRegression().fit(X_train, y_train)
ここで、我々はfitメソッドの返り値(つまりself)を訓練済みモデルである変数logregに割り当てている。このように複数のメソッド呼び出し(ここでは__init__とfit)を続けて書くことを、メソッドチェーンと呼ぶ。

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

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

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

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

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

guest

回答3

0

pythonに限らず他の言語でもあります
phpの例を提示しますね

php

1class foo { 2 protected $a; 3 protected $b; 4 public function setA($a) 5 { 6 $this->a = $a; 7 } 8 9 public function setB($b) 10 { 11 $this->b = $b; 12 } 13} 14 15$test = new foo; 16$test->setA(10); 17$test->setB(20);

このように$this(selfど同じ意味)を返却していない場合は↑こうなります
ところが$thisを返すようにすると

php

1class foo { 2 protected $a; 3 protected $b; 4 public function setA($a) 5 { 6 $this->a = $a; 7 return $this; 8 } 9 10 public function setB($b) 11 { 12 $this->b = $b; 13 return $this; 14 } 15} 16 17$test = new foo; 18$test->setA(10) 19 ->setB(20);

のように一気に書けるんです

投稿2021/10/01 03:31

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

fitメソッドがselfを返さないとどういう式になるのでしょうか?

python

1logreg = LogisticRegression() 2logreg.fit(X_train, y_train)

コードに__init__が現れておらず

LogisticRegression()のことです。

投稿2021/10/01 03:30

ozwk

総合スコア13553

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

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

0

ベストアンサー

__init__はPythonにおけるコンストラクタです。
LogisticRegression()LogisticRegression.__init__()が実行されるので、そういう意味でしょう。
self実行時には見えず、暗黙的に代入されるはメソッドの第一引数で、オブジェクト自身のことです。呼び出すときは見えませんが、クラス定義では__init__(self)等となっており、クラス中で自身を参照する際に利用します。
__init__では必ずselfが返ります。
つまり、LogisticRegressionで返るオブジェクトのfitを実行して返るオブジェクト自身を得るということでしょう。

実際的には

py

1logreg = LogisticRegression() 2logreg.fit(X_train, y_train)

でも何も変わりませんし、なんの問題もないですが、初期化時にfitまでまとめてした方が可読性が高く楽ってことだと思います。

投稿2021/10/01 03:26

編集2021/10/01 03:29
kairi003

総合スコア1332

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

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

cunwe

2021/10/03 07:04

ご回答いただきありがとうございます。 僕は今まで何も考えずにlogreg = LogisticRegression().fit(X_train, y_train)のように書いてしまっていたのですが、クラス定義で__init__(self)となってないクラスを使うときは logreg = hogehogeClass() logreg.fit(X_train, y_train) のように書かなくてはいけないということでしょうか?
kairi003

2021/10/03 08:19 編集

いえ、__init__は戻り値が必ずselfであり(他の値を返そうとするとエラーになる)、未定義でも勝手に定義されるので定義されないってことはないです。 むしろ今回のケースが特殊なのはfitの戻り値がselfな点です。このおかげでインスタンスの生成にそのまま繋げて書くことができるわけですね。 logreg = hogehogeClass() logreg.fit(X_train, y_train) みたいに書かなきゃいけない、というケースは、例えばrangeからリストを作って末尾に0を加えたいときに li = list(range(10)) li.append(0) とする、みたいな話ですかね… appendは戻り値がNoneなので li = list(range(10)).append(0) と書いたらliにはNoneが代入されてしまいます。(まあこの場合普通に+で繋げればいいんですが…) しかし、自分でlistを継承したクラスを定義して、 class MyList(list): ____def my_append(self, x): ________self.append(x) ________return self (コメントはインデントが効かないのでアンダーバーを書いてます) とappendしてselfを返すメソッドを定義すれば li = MyList(range(10)).my_append(0) でliにきちんと[0,1,...9,0]が代入されます。
cunwe

2021/10/04 15:52

fitの戻り値がselfなのが例外的なのですね。append()についてですが今回はわかりやすく例として使っただけで、実際には実務とかでは独自のappend()を作ってしまうと後々の人が混乱するのでしょうか?
kairi003

2021/10/04 18:02

そうですね。appendは例で、実際に意味もなく改造するのはあまり推奨できません。 このような「自分を返すメソッド」で1文のうちにメソッドを連続して実行する手法はメソッドチェーンと呼ばれていてそこそこメジャーな設計ですが、多用するかは言語とライブラリによります。 Pythonでは画像処理とかnumpy系ではわりと使うイメージがあります。
cunwe

2021/10/05 10:35

なるほど、そうなのですね。メソッドチェーンの仕組みと画像処理やnumpy系では使われがちということを理解しました、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問