scikit-learnでグリッドサーチしようとすると出るjoblibのエラー

scikit-learn でグリッドサーチをやろうとしたら
ImportErrorが出てしまうという問題に遭遇しました。
自分の環境は Python2.7 Windows7です。

コア数を指定しない(n_jobsを設定しない)ことでこのエラーを回避できます。

エラーメッセージ

ImportError: [joblib] Attempting to do parallel computing without protecting your import on a system that does not support forking. To use parallel-computing in a script, you must protect your main loop using "if name == 'main'". Please see the joblib documentation on Parallel for more information

gs = GridSearchCV(clf, param, n_jobs=-1)
↑これだとエラーが出る

gs = GridSearchCV(clf, param)
↑これだと動く

これは Windows を使用している場合に発生するエラーのようです。
またこういったバグが直されているであろう Python3.X を使った方がいいよ、
という意見もフォーラムでありました。

参考
https://github.com/scikit-learn-contrib/hdbscan/issues/22
https://github.com/joblib/joblib/issues/354

scikit-learnの識別器

SVM

from sklearn import svm
にある
svm.sc のカーネルには
linear poly rbf sigmoid precomputed
がありデフォルトは rbf
precomputed についてはよくわかんね
Cの値を上げると学習データの正解率を上げられる
当たり前だが C を大きな値にすると過学習になる
↓こんな風に簡単にパラメータを設定できる
clf = svm.SVC(kernel = "rbf", C = 10)

K近傍

from sklearn.neighbors import KNeighborsClassifier
にある
一番近いところから順に K 個の多数決で自分のクラスを分類するので
K は奇数がいいらしい
K の値は n_neighbors=K といったように設定する
clf = KNeighborsClassifier(n_neighbors=2)

多層パーセプトロン

from sklearn.neural_network import MLPClassifier
にある
乱数の関係で毎回実行する度に結果が少し変わるので
パラメータをいじって比較したい時とかは
乱数のシード値を決める必要がある
clf= MLPClassifier(random_state=8)

ランダムフォレスト

from sklearn.ensemble import RandomForestClassifier
にある
乱数のシード値は多層パーセプトロンと同じように
clf = RandomForestClassifier(random_state=8)
と設定できる
ほかに
clf.max_depth = 1 枝分かれの数
clf.n_estimators=1 木の数
といった設定が必要

決定木

from sklearn import tree
にある
clf = tree.DecisionTreeClassifier()


時間がある時に加筆修正予定

 

プレーヤー死亡時にラグドール化する

ゲームによくある、キャラクターが死んだときに重力に従ってパタッて倒れるやつです。
サードパーソンエグザンプルマップを使ってやってみます。
ラグドール化には
Set Simulate Physics や Set All Bodies Simulate Physics というノードを使います。

Set Simulate Physics は、
「物理シミュレートのオン・オフ」を設定できます。
Target にはもちろん物理シミュレートさせたい(或いはやめさせたい)メッシュを接続します。
Simulate のチェックボックスにチェックを入れると物理シミュレートがオンに、
チェックをはずすと物理シミュレート無しになります。

▼Set Simulate Physics と Set All Bodies Simulate Physics の違い

・Set Simulate Physics
ターゲットは Primitive Component Reference
Primitive Component は一般的に Capsule Component や StaticMeshComponent、SkeletalMeshComponent のこと

・Set All Bodies Simulate Physics
ターゲットは Skeltal Mesh Component Reference となっています。

差は多分それだけです。
今回はプレーヤー死亡時の演出ということで、キャラクターのメッシュ全体を物理シミュレーションするので
どっちを使っても差は無いはずです。

▼ブループリント

Rキーを押したらプレーヤーキャラクターが死んで物理シミュレーションされるようなノードを組みます。

f:id:tabascolabo:20170606020822j:plain

このブループリントでまずカプセルコンポーネントコリジョンを無効化し、
プレイヤーキャラクターのメッシュを物理シミュレーションします。
なぜカプセルのコリジョンを無効化する必要があるのかというと、
物理シミュレーション開始時にカプセルとメッシュのコリジョンが重なってしまい、
わけのわからない方向に突然吹っ飛ぶのを防ぐためです。
またメッシュのコリジョンプリセットをBlockAllにしておかないと、
シミュレーションが始まった瞬間に床をすり抜けて落ちてしまいます。
さらに画像にはありませんが、Camera Boom を Mesh の子にしてあげてください。
こうすることで、死亡時に衝撃を受けて吹っ飛んでもカメラがメッシュを追いかけてくれるようになります。

その場でRキーを押すとフニャァ…とプレーヤーキャラクターが倒れるようになりましたが、
ジャンプしながら死んだり、走りながら死ぬとなぜか2~3秒後にメッシュが消滅する怪現象が
発生するはずです。
この原因は、勢いよく動きながら死んだ場合、カプセルのコリジョンが無効化された時
その勢いを保持したまま床をすりぬけて下に落ち、
デフォルトで存在するキルゾーンに触れてカプセルが消滅し、
結果としてカプセルの子であるメッシュも消滅するためです。

キルゾーンを消す

対策のひとつとして、デフォルトで存在するキルゾーンを消します。
ワールドセッティングの Enable World Bounds Checksをオフにすると
デフォルトのキルゾーンが消滅します。

f:id:tabascolabo:20170606020845j:plain

これでプレーヤーが死ぬと、デストロイされるまでカプセルは無限に下に落ちていきます。
死んでもずっとメッシュは消えないで残ってくれるようになりました。

▼失敗した解決案

以上でとりあえずプレーヤーが死んだときにキャラクターが物理法則に従って倒れるようにできましたが、
カプセルがキルゾーンに触れてメッシュが消滅してしまう問題の対策に、
もうひとつ思いついた案があったものの、うまくいきませんでした。

死んだときにカプセルが重力から影響を受けないように設定する、というものです。

f:id:tabascolabo:20170606020913j:plain

Set Enable Gravity というノードを使って、物理シミュレーション開始と同時に
カプセルが重力の影響を受けないように設定してみたのですが、
うまくいかず、カプセルは下に落ちていってしまいました。
カプセルの Physics にある Enable Gravity をオフにしたらいけるかな?とも思いましたが
これもうまくいかず、カプセルが下に落ちてしまいます。
詳しい人がいらっしゃいましたらぜひ教えて下さい。

▼関連したノード

Set All Bodies Below Simulate Physics
ボーンを指定して、そのボーンとそのボーンより下のボーンすべてを物理シミュレーションする。
つまりキャラクターの一部だけ物理シミュレーションできる。

Set All Bodies Below Physics Blend Weight
上のとほとんど同じだがどれくらい物理シミュレーションの影響を受けるか指定できる。

 

参考
https://docs.unrealengine.com/latest/INT/BlueprintAPI/Physics/SetSimulatePhysics/index.html
https://docs.unrealengine.com/latest/JPN/Programming/UnrealArchitecture/Actors/Components/index.html#プリミティブコンポーネント
https://docs.unrealengine.com/latest/JPN/Engine/Animation/PhysicallyDrivenAnimation/index.html
https://www.youtube.com/watch?v=VVapMSojytg
http://unrealbussan.hatenablog.com/entry/2015/03/10/200716

 

勉強のやる気がでない時の対策

やる気がでないのは誰にでも起こりえること
やる気がでない自分を責めて自己嫌悪に陥ってもそれは解決にならない
やる気を出すための対策方法を考えてみよう

▼そもそも勉強する体力があるか

例えば仕事や学校から帰ってきて、夜勉強するぞとなると
体力的に厳しい場合がある
それはやる気がないのではなく勉強する体力が残ってないわけで
ここをごっちゃにしないように
理想を言うなら勉強するなら朝がいい
寝る前とかはきつい

▼睡眠時間を減らさない

勉強するために睡眠時間を減らすのはあまりおすすめしない
忙しくてそうしないといけないのもわかるが
眠いのを我慢して勉強するのはかなり効率が悪い
やるなら勉強前にシャワーを浴びて目を覚ますとか
眠気を飛ばす対策が必要

▼他人を巻き込む

ひとりでやってると自分との戦いになって
孤独な戦いの中多くの戦士が志半ばに倒れていくもの
勉強とはだいたい暗記なので
友達に単語を覚えたりするのを手伝ってもらえばいい
友達が単語を読んで、自分が単語の意味を答えるとか
これならSkypeとかでもできる
相手に利点がないので金で買収したり
夕飯を奢るとかなんらかの対価を用意しよう
ここで注意してほしいのはライバルを見つけて
競い合おうということではないということ
自分の勉強を手伝ってくれるポジションの人を作るのが大事

▼まず5分でもいいから始める

人間はやりはじめないとやる気がでないという脳の欠陥を持っている
やりはじめるまでが一番つらい
でもやりはじめたらなんとかなるから
とりあえず5分だけでも、とか1ページだけでも、と始めればいい
できないくせに毎日10時間勉強しようとか意気込むのは初心者がよくやるが
身の程を知ろう
おまえはそこまで根性がある人間ではない
現実を見ろ

▼だらだらやることを否定しない

これも上の「5分だけでいいから!さきっちょだけだから!」と似てるが
あんまりやる気でないから一切やらない、やる気が超ある時のみ効率重視でやる!という考え方は糞
0か1かの二元論で考えるのは子供
大人はグレーなところも受け入れられるのである
どれだけ効率よくやってもやはり勉強時間ってのは重要だから
1か100で言ったらそれは100のほうがいいけど、
0か0.1なら0.1が絶対いいに決まってる

▼適度な運動をとる

勉強はストレスがたまる
特に暗記しなくちゃいけないことが多い時
家の周りを1~2周軽く走ったりして外の空気を吸って体を少し動かそう
頭がすっきりする
ここでガチって10kmも走り出すのは馬鹿

▼場所を変える

勉強は机に向かってやらなくてはいけないというルールはない
マンネリを防ぐためにたまには立って勉強したり
カフェやレストランで勉強したりして気分を変えよう
過ごしやすい季節なら公園のベンチでもいい

▼まとめ:やる気がないのは気合いでなんとかならない

人間というものは、やるぞおおおって毎日やる気が出るものではない
まずその現実を見る
自分の理想的な勉強のしかたにとらわれずに
どうやって勉強のストレスをコントロールするかが重要なのだ

  

DOTAというゲームから辿り着くフィリピン人の真の英語力

DOTAってゲーム知ってる?
ゲームなのにプレイするとストレスが溜まるファックなゲーム
日本ではあまりメジャーではないせいで
オンラインでプレイすると必ずフィリピン人とマッチングする神ゲー
もちろん皮肉で言ってるんだぞ

だがこの記事で俺が言いたいのは
あいつらピノイがどれだけDOTAの世界においてクソな連中かということではなく
ゲーム中にフィリピン人の英語がガバガバすぎて何言ってるかわからないことが多々あって
「フィリピン人も英語ヘッタクソだなー」なんてなんともなしに思っていたんだが
ふと身の回りにオンラインで格安でフィリピン人と英会話できるサービスとか
フィリピンに英語留学とか耳にすることが少なくないことに気づいて
フィリピン人の英語力に疑問を持った

ネットで検索してみるとフィリピンに英語留学というのはメジャーらしく
「フィリピン 語学留学」で検索するとズラーッと情報が出てくる
「フィリピン 英語」で検索すると
フィリピン人の英語はうまい!なぜなのか!フィリピン人に学ぶ英語教育!
みたいなタイトルの記事もたくさん出てくる
意味がわからない
俺の知ってるフィリピンはフィリピンではなかったのだろうか
でもあいつらキレはじめるとbobo putang ina moとかgago!tanga!とタガログ語で騒ぎはじめるし
間違いなくフィリピン人のはずである

俺の推測では英語が公用語になっているが日常ではタガログ語で話してると思われる
フィリピン人同士ではタガログ語でチャットしてるし
こちらが英語でチャットすると最初は彼らも英語でチャットするけど
キレはじめるとタガログ語で騒ぎ出す
興奮して素が出ている時に話す言語が最も身近な言語のはずだと考えるとやはり英語ではなく
タガログ語が最も身近な言語のようだ
日常では英語で話していると主張するサイトも多いが俺は信じられない

DOTAプレーヤーなら奴らはキレるとタガログ語でしか話さなくなるということはみんなが知っている
ソースはフィリピンに興味が毛ほどもないのにboboとかtanga putaとかいつのまにか覚えた俺

フィリピン人が英語を話せる理由としてよくあがるのが、
フィリピンはアメリカの植民地だったから、というもの
フィリピンがアメリカから独立したのは70年前
植民地時代にアメリカ人が移り住んで英語教育が行われていたとしても、
現在のフィリピン人の英語力の根拠とするには少し時が経ちすぎている

ここでひとつ知っておいてほしいのが
公用語=みんなが正しくその言語を話せる ではない
公用語は国が規定するものであり客観的事実ではない
たとえばウクライナにはロシアから来た人が多く住んでいて
一部の例外を除いてほぼ全員がロシア語とウクライナ語の両方を話すし
多くの人が普段からロシア語を話す
しかしウクライナ公用語としているのはウクライナ語のみである

フィリピンでの事情を考えてみよう
フィリピンの場合アメリカからの移民が多く来たためにフィリピンで英語が話されるようになったわけではなく
英語学習に力を入れると同時に英語を公用語としただけ
現地にアメリカ人が多く住み着いて英語が話されるようになったわけではない
実際フィリピンにアメリカ人はほとんど住んでいない
(http://www2.ttcn.ne.jp/honkawa/8130.html)

これが意味するのは、フィリピン人は学校で勉強して英語を話せるようになるわけで
当然中には勉強ができない人もいる
フィリピン人はみんな英語が話せる、と言いきるのは難しいのではないか

またフィリピンの英語講師のレベルがやばいと暴露している
現地の語学学校のブログもある
http://brighture.jp/b-blog/266

実際にフィリピン人の英語をyoutubeで聞いてみよう

www.youtube.com


youtubeでネイティブ(多分アメリカ人)が「なぜフィリピンで俺の英語が通じないのか」というビデオを載せていたので興味がある人は検索してくれ

フィリピン人が英米人と同等の英語力を持っていると考えるのは100%間違いで、
フィリピンへの語学留学が完全な英米への留学の代替となるとは言えない
彼らはネイティブではないのだ
それでも安価だし行く意味が全くないわけではないので行くのは自由だ
俺は行かないけどな

これから英語だけで食っていくのはきつい

▼外国語教室を経営する場合

・思ったより需要が無い

自分が外国語教室を経営した場合
生徒を集めるのはなかなかきつい
外国語ができるようになりたいと思う人は多いはず!と思うかもしれないが
それは「宝くじあたったらいいな」と思う人が多いのと同じで
自分の自由時間を削って外国語を身に付けたいと思う人は実際にはあまりいない
個人的に大手の外国語教室はブラックジャック並に法外な値段設定だと思うけど
経営者側からすると無理して客単価をあげないとやっていけないのが実情

そもそもブラックジャックは法外な値段で病気やけがをほぼ100%治してくれるけど
英会話教室は高い金払っても英語がぺらぺらになることを保証はしてくれないと考えると
ブラックジャックよりタチが悪いと思われてもしょうがない

 

・客単価をあげるしかない

自分が外国語を教えていた時はレッスン1回ごとに支払いで
来たくなったら予約するというシステムだったが
無料体験のあとに1-2回来て消える人が多かった
こういった支払い方法は客側から考えると安心だが利益が安定しない
だから英会話教室は数ヶ月分まとめて最初に金とるところが多い
俺は人格者なので安心明瞭会計やめたくなったらいつでもOKだった
だが商売において客の利益ばかり優先するのは悲しいことに糞なのである

長く通う人は留学したい人とか仕事で絶対その外国語が必要な人
話せるようになりたいという漠然とした理由で続くのはあまりいない
あたりまえだけど

 

・日本人の先生をいやがる人も少なくない

学習者は日本人の先生が英語を教えるのをいやがる人が多い
白人に教わりたいっていう前言ったようなホスト代わりに通いたいと考える人もいるし
日本人の先生は発音が悪いとか、英語を間違えると考える人もいる
日本人で発音悪い先生とか現地に滞在した経験がない先生とか少なくないのも現実だからしゃーない

 

・学校の授業のサポートは塾や家庭教師の守備範囲

小学校でも英語教育が始まったがそれは他の教科も教えられる塾や家庭教師でカバーできる
英語が苦手な小学生や中学生は外国語教室に通うのではなく塾や家庭教師に頼むのが普通

 

▼翻訳家の場合

翻訳をするにしても訳されてない本がそもそも少数
本とかウェブサイトの機械翻訳ならGoogleががんばってるし
まだ完全ではないにしろ人工知能が発展していく今、紙媒体の翻訳の未来は暗い
通訳とか、ビデオに字幕をつけるといったことはまだまだ人間がやらなくちゃいけないから
そっちを中心にしていったほうがいいのかも

 

▼映画やゲームの字幕作る人の場合

そもそも字幕つける人にあまり英語力を求められていない
映画の字幕で言えば例えば戸田奈津子みたいな誤訳しまくりな人がいても
配給会社は正確な翻訳にそこまで興味ないし、多少の誤訳のせいでその映画を見る客が減ることもない
となるとハードルが低いこともあり供給過多な感じがする

 

▼翻訳に需要がないわけではない

自分が例えばプログラミング中に新しいライブラリを使いたい場合
大概ライブラリの仕様はあたりまえだが英語で公開されていて
英語が読める自分でもよくわからんライブラリの仕様を英語で読むのはめんどい
「これの日本語訳だれか作ってねーのかよ」と思うことは日常茶飯事だが
専門用語が多い翻訳はその道である程度経験がないとつらいところがあって
英語一辺倒の翻訳家だと苦労する
むしろ英語が少しできるプログラマのほうが理解はできたりする
こう考えると英語しかできない人ってあんまり役に立たねーな

 

▼これから英語で食っていこうとする人は…

そういうわけで英語で食っていこうと思ってる人は自分がこれからどのように仕事を見つけていくか考えて
時代の流れに注意していないと食いっぱぐれる(そもそもこれは英語だけの話ではないが)
今まであった仕事がなくなるわけだから先人の行き方を参考にしていると困ることになるかもしれない