データや海外や日々の生活や・・・

データや海外や日々の生活や・・・

データサイエンス、AI、留学、インターンシップ、日々の生活にまつわることなど、いろいろ書いてみます。

Amebaでブログを始めよう!

Python Anacondaに入っているライブラリのアップデート方法は、

 

conda update --all

 

でできるとわかっているのですが、Python Anaconda自体のバージョンをアップデートするには、以下のように

 

  • conda update conda でconda自体の更新を実施
  • conda update anaconda でanacondaの更新を実施
で良いらしい。
 
以下のページが大変参考になります。

https://qiita.com/kznx/items/79d5b122a2eb0ab91067

 

MADlibを使って重回帰モデルを作成する方法を記述します。

サンプルコードはdoc.madlib.netから取ってきてます。
ドキュメンテーションは以下の画像を見て探してください。
Supervised Learningの中にあります。

madlib_regression_page

 
サンプルでは、不動産価格を予測する回帰モデルを作成しています。
housesという名前のデータ(テーブル名)
・ID
・tax 固定資産税の額(US$)
・bedroom  ベッドルームの数(部屋数)
・bath バスルームの数(部屋数)
・price 住宅価格(US$) →目的変数です
・size 床面積(平方フィート)
・lot 敷地面積(平方フィート)


まずは分析をするデータを作成します。
テーブルを作成し(CREATE TABLE)、そこにデータ値を追加します(COPY)。
CREATE TABLE houses (id INT, tax INT, bedroom INT, bath FLOAT, price INT,
            size INT, lot INT);
COPY houses FROM STDIN WITH DELIMITER '|';
  1 |  590 |       2 |    1 |  50000 |  770 | 22100
  2 | 1050 |       3 |    2 |  85000 | 1410 | 12000
  3 |   20 |       3 |    1 |  22500 | 1060 |  3500
  4 |  870 |       2 |    2 |  90000 | 1300 | 17500
  5 | 1320 |       3 |    2 | 133000 | 1500 | 30000
  6 | 1350 |       2 |    1 |  90500 |  820 | 25700
  7 | 2790 |       3 |  2.5 | 260000 | 2130 | 25000
  8 |  680 |       2 |    1 | 142500 | 1170 | 22000
  9 | 1840 |       3 |    2 | 160000 | 1500 | 19000
 10 | 3680 |       4 |    2 | 240000 | 2790 | 20000
 11 | 1660 |       3 |    1 |  87000 | 1030 | 17500
 12 | 1620 |       3 |    2 | 118600 | 1250 | 20000
 13 | 3100 |       3 |    2 | 140000 | 1760 | 38000
 14 | 2070 |       2 |    3 | 148000 | 1550 | 14000
 15 |  650 |       3 |  1.5 |  65000 | 1450 | 12000
\.

データ値の追加はINSERTでも問題ありません。
INSERT INTO houses (id, tax, bedroom, bath, price, size, lot) VALUES
(1,590,2,1,50000,770,22100),
(2,1050,3,2,85000,1410,12000),
(3, 20,3,1,22500,1060,3500),
(4,870,2,2,90000,1300,17500),
(5,1320,3,2,133000,1500,30000),
(6,1350,2,1,90500,820,25700),
(7,2790,3,2.5,260000,2130,25000),
(8,680,2,1,142500,1170,22000),
(9,1840,3,2,160000,1500,19000),
(10,3680,4,2,240000,2790,20000),
(11,1660,3,1,87000,1030,17500),
(12,1620,3,2,118600,1250,20000),
(13,3100,3,2,140000,1760,38000),
(14,2070,2,3,148000,1550,14000),
(15,650,3,1.5,65000,1450,12000);

次に回帰モデルを作成します。
以下のmadlib.linregr_train()が回帰モデルを作成する関数になります。
SELECT madlib.linregr_train( 'houses', -- インプットデータ名
                             'houses_linregr', -- アウトプットテーブル名
                             'price', -- 目的変数の名称
                             'ARRAY[1, tax, bath, size]' -- 説明変数のリスト
                           );

注意点が一点あります。
説明変数のリストをARRAYで作るわけですが、ARRAYの最初の値が1となっています。
これは、切片を意味するものですので、必ずこれを追加するようにしてください。

モデルを作成した後は、モデルのサマリーを見てみましょう。
私はpgAdmin3をよく使いますが、その場合は以下のように記述します。
SELECT unnest(ARRAY['intercept','tax','bath','size']) as attribute,
       unnest(coef) as coefficient,
       unnest(std_err) as standard_error,
       unnest(t_stats) as t_stat,
       unnest(p_values) as pvalue
FROM houses_linregr;

ターミナルを利用している方は以下のようにすると、結果が見やすいと思います。
\x ON
SELECT * FROM houses_linregr;


作成した重回帰モデルを使って、予測値を計算することもできます。
その際にはmadlib.linregr_predict()という関数を使います。
以下はその予測値計算関数を用いて、予測値と実測値の差を計算しています。
SELECT houses.*,
       madlib.linregr_predict( ARRAY[1,tax,bath,size],
                               m.coef
                             ) as predict,
        price -
        madlib.linregr_predict( ARRAY[1,tax,bath,size],
                                  m.coef
                                ) as residual
FROM houses, houses_linregr m;
predictが予測値、priceは実測値、price-predictを計算したものをがresidual(誤差)と解釈できます。

グルーピングカラム
少し応用ですが、MADlibの重回帰モデル作成の関数にグルーピングカラムというものを指定することができます。
これは、「◯◯ごとにモデルを作るように指定」するためのものです。
たとえば、顧客セグメントごとにデータを分割して、セグメントごとにモデルを作成する、というようなグループがデータ内で分割されている場合に非常に便利です。

以下の例では、この記事で利用したhousesの中で、bedroom、つまりベッドルームの部屋数でデータを分割し、それぞれでモデルを作成する作業を行っています。
つまり複数のモデルを一気に作成してしまうのです。
出力結果はすべてhouses_linregr_bedroomに格納されます。
ベッドルームが1部屋の住宅を抽出し、1つの重回帰モデルを作成する、
ベッドルームが2部屋の住宅を抽出し、1つの重回帰モデルを作成する、
ベッドルームが3部屋の住宅を抽出し、1つの重回帰モデルを作成する、、、
といった具合に、ベッドルームでデータを分割しています。
SELECT madlib.linregr_train( 'houses',
                             'houses_linregr_bedroom',
                             'price',
                             'ARRAY[1, tax, bath, size]',
                             'bedroom' -- グルーピングカラムのカラム名
                           );

モデル作成後、以下のコマンドを実行すると、作成された複数のモデルの概要が全て表示されます。
SELECT * FROM houses_linregr_bedroom;


以上です。ぜひお試しください。

大容量のデータを分析することに長けている分析ライブラリ、MADlibの紹介です。
MADlibとはなんだ?という方は多いと思いますが、

・ポスグレ上で動く統計解析・機械学習アルゴリズムが実装されたライブラリです。
・SQLに組込む形で記述しますので、SQLを利用して分析を行うような感触があります。
・オープンソースライブラリです。2015年後半にApacheに移管されました。

ダウンロードは以下のサイトから可能です。
オープンソースなのでもちろん無料です。
http://madlib.net/

オープンソースなので、メーリングリストに参加しておくことをオススメします。
コミュニケーションは全て英語ですが、質問などがある場合コミュニティに質問を投げられます。
メーリングリストに入るためには、user-subscribe@madlib.incubator.apache.orgへメールを送る必要があります。

MADlibのインストールの仕方については別の方が記事に書いていますので、そちらを参考にしてみてください。
http://kenpg2.seesaa.net/article/405465966.html


MADlib関数の使い方については、以下のサイトが参考になります。
http://doc.madlib.net/latest/

それぞれの分析手法のドキュメンテーションは上のウェブページ内、右側のメニューで選びます。
たとえばランダムフォレストの場合は、
Supervised Learning → Tree Methods → Random Forest
とたどると見つかります。

その後、Modulesの中のRandom Forestをクリックすると、MADlibのRandom Forestの使い方について説明があります(英語です)。

doc_rf_help_file

このページは主に前半と後半に分かれており、

前半:実装されているMADlib関数の定義についての説明
後半:サンプルコード

となっています。
とにかく使ってみたほうが早い、という方は後半のサンプルコード(Examplesという箇所以下)をご覧ください。

いくつかの分析手法の使い方については、別の記事に備忘録として記述していきます。
MADlibを使ったランダムフォレストの使い方についての記事です。
MADlibとはなんだ?という方もいると思いますが、こちらの記事を参考にしてください。

MADlibランダムフォレストについての説明は以下のウェブページをご覧ください。
http://doc.madlib.net/latest/

ドキュメンテーションは上のウェブページ内、右側のメニューで
Supervised Learning → Tree Methods → Random Forest
とたどると見つかります。
その後、Modulesの中のRandom Forestをクリックすると、MADlibのRandom Forestの使い方について説明があります(英語です)。

doc_rf_help_file

このページは主に前半と後半に分かれており、

前半:実装されているMADlib関数の定義についての説明
後半:サンプルコード

となっています。
とにかく使ってみたほうが早い、という方が多いと思うので、サンプルコードを見ていきたいと思います。

サンプルでは、dt_golfというデータ・セットを使っています。

dt_golf:ゴルフに行ったかどうかに関するデータ。格納されているカラムは以下のとおり
・OUTLOOK”  天気(晴れ、曇り、雨)
Temperature  気温(華氏)
humidity  湿度(%)
windy  風が強いかどうか(TRUE/FALSE
class  ゴルフをするかどうか(Play/Don’t Play)→目的変数

まずはdt_golfのデータを作成
以下でテーブルを作成
DROP TABLE IF EXISTS dt_golf;
CREATE TABLE dt_golf (
    id integer NOT NULL,
    "OUTLOOK" text,
    temperature double precision,
    humidity double precision,
    windy text,
    class text
) ;

データ値をINSERT文で追加する。
COPYコマンドのほうが私は楽だと思いました。
INSERT INTO dt_golf (id,"OUTLOOK",temperature,humidity,windy,class) VALUES
(1, 'sunny', 85, 85, 'false', 'Don''t Play'),
(2, 'sunny', 80, 90, 'true', 'Don''t Play'),
(3, 'overcast', 83, 78, 'false', 'Play'),
(4, 'rain', 70, 96, 'false', 'Play'),
(5, 'rain', 68, 80, 'false', 'Play'),
(6, 'rain', 65, 70, 'true', 'Don''t Play'),
(7, 'overcast', 64, 65, 'true', 'Play'),
(8, 'sunny', 72, 95, 'false', 'Don''t Play'),
(9, 'sunny', 69, 70, 'false', 'Play'),
(10, 'rain', 75, 80, 'false', 'Play'),
(11, 'sunny', 75, 70, 'true', 'Play'),
(12, 'overcast', 72, 90, 'true', 'Play'),
(13, 'overcast', 81, 75, 'false', 'Play'),
(14, 'rain', 71, 80, 'true', 'Don''t Play');

データの準備ができたので、ランダムフォレストの関数を実行。
DROP TABLE IF EXISTS train_output, train_output_group, train_output_summary;
SELECT madlib.forest_train('dt_golf',         -- インプットテーブル名
                           'train_output',    -- アウトプットテーブル名(モデルはここにあります)
                           'id',              -- id カラム(各レコードのIDとなるカラム)
                           'class',           -- 目的変数の名称
                           '"OUTLOOK", temperature, humidity, windy',   -- 説明変数のリスト
                           NULL,              -- 説明変数のうち、分析に用いない変数のリスト
                           NULL,              -- グルーピングするカラム(後述)
                           20::integer,       -- 生成するツリーの数
                           2::integer,        -- 個々のツリーで利用する説明変数の数
                           TRUE::boolean,     -- 変数の重要度を出力するかどうか
                           1::integer,        -- 重要度計算時に変数の配列を変更する回数
                           8::integer,        -- ツリーの深さの最大値
                           3::integer,        -- 中間ノードにおけるサンプル数の最小値
                           1::integer,        -- リーフにおけるサンプル数の最小値
                           10::integer        -- 連続値の説明変数を分岐させる粒度を設定。
                           );

このmadlib.forest_train()という関数がMADlibのランダムフォレスト関数です。
以下、注意点です。


出力されるテーブル
この関数を実行すると、以下の3つのテーブルが出力されます。
具体的には、アウトプットテーブル名そのままのテーブルが1つ、そして、そのアウトプットテーブル名に"_group"、"_summary"という言葉がつく2つのテーブルが生成されます。
上記のサンプルの場合だと、アウトプットテーブル名がtrain_outputなので、以下のように3つのテーブルが生成されます。
train_output, train_output_group, train_output_summary


IDカラム
また、IDカラムというのは、個々のレコードを別々のものとして識別するためのIDになります。
もし分析対象のテーブルにそのカラムがない場合は、連番を振るなどして作成してください。


説明変数のリスト
説明変数のリストは、変数の数が多い場合、いちいち変数名を列挙することがめんどくさくなります。
そこで、目的変数のカラム以外全てを指定したい場合は*(アスタリスク)で指定できます。
その場合、往々にして説明変数に利用しないカラムも含まれると思いますので、その場合はその次のパラメータであるlist_of_features_to_excludeに除外したいカラムのリストを指定します。


変数のデータ型
変数のデータ型ですが、カテゴリ値と連続値を設定する際に注意が必要です。
カテゴリ値:text、integer
連続値:double precision

モデルを作成する際に連続値として指定したい変数は、必ずdouble precisionにしてください。
integerになっていると、madlib.forest_train()はカテゴリ変数だと認識してしまい、計算量が非常に多くなりますし、また正しい結果が出てこない可能性もあります。


グルーピングするカラム
グルーピングは、他の分析アルゴリズムではあまり見かけないパラメータだと思います。
何をために存在するのかというと、「◯◯ごとにモデルを作りなさい」ということをMADlibに伝えるために存在しています。
この◯◯がグルーピングする単位ということになります。
たとえば、顧客セグメントIDごとに解約予測モデルを作成する、機器の種類ごとに故障予測モデルを作成する、など、どの単位でモデルを作成するのかを指定できる、非常に便利なパラメータです。

たとえば、顧客セグメントが10つに分かれていて、インプットテーブルに顧客セグメントIDというカラムがある場合、このカラムをグルーピングカラムとして指定してください。
すると、アウトプットテーブルには、10つのモデルが全て格納されます。

非常に多くのモデルを一挙に作成したい場合、グルーピングカラムを指定してください。

以上が指定することが必須なパラメータとなります。
それ以外のパラメータはモデルのチューニングに必要ですが、ここでは説明は割愛します。
ツリーの数は指定してもよいかもしれませんね。

以下、doc.madlib.netの記述から脱線します。


出力結果の見方
MADlibのランダムフォレストの出力結果のうち、見たい値がどこに格納されているのか、は正直わかりづらいです。
OOBエラーはtrain_output_summaryに入っているので、以下のSQLで表示できます。
SELECT oob_error FROM train_output_summary;
これがグルーピングカラムをセットしていると、OOBエラーがモデルごとに格納されています。
その場合、たとえばOOBエラーの最大値、最小値、平均値などを出してみてもよいですね。
SELECT max(sqrt(oob_error)), min(sqrt(oob_error)), avg(sqrt(oob_error))
FROM rf_output_group;


モデルを使った予測
作成したモデルを用いて予測値を計算することももちろん可能です。
その際、以下のmadlib.forest_predict()という関数を使います。
DROP TABLE IF EXISTS prediction_results;
SELECT madlib.forest_predict('train_output', --モデルが格納されているテーブル名
                             'dt_golf', -- 予測したい値が入ったテーブル名
                             'prediction_results', -- 予測値を計算した結果を出力するテーブル名
                             'response'); --予測するのか、分類するのかを指定
これを実行すると、prediction_resultsというテーブルに予測値が出力されます。
次に、その予測値の結果を、実測値と比較しているのが次のSQLコマンドになります。
SELECT id, estimated_class, class
FROM prediction_results JOIN dt_golf USING (id)
ORDER BY id;
estimated_classはprediction_resultsに入っている予測値、classはdt_golfに入っている実測値です。

この実測値と予測値を使って予測の正答率を計算することもできますし、ランダムフォレストで回帰をする場合、RMSEを計算することもできますね。
正答率やRMSEの計算はここでは割愛します。


変数の重要度
最後に変数の重要度を見てみます。
重要度の値はtrain_output_groupに格納されています。
ただ、このgroupのテーブルだけを見ても、重要度の値が羅列されているだけで、どの変数の重要度の値なのか、全くわかりません。
この重要度の値の順番は、もうひとつ別のテーブル、train_output_summaryに格納されています。
さらに、カテゴリ値の変数と連続値の変数が別々のカラムに格納されているので、これらをまとめるのは少しめんどくさい作業になります。

では、実際に重要度の値の一覧を作成してみます。
まず、その一覧をまとめるテーブルを作成します。
DROP TABLE IF EXISTS importance_table;
CREATE TABLE importance_table (feature_names text, importance double precision);

次に、カテゴリ変数、連続値変数それぞれで重要度のリストを作成します。
まずはカテゴリ変数から作成します。
INSERT INTO importance_table
SELECT regexp_split_to_table(val_names.cat_features, '.') AS categ_features,
unnest(val.cat_var_importance) AS cat_importance
FROM train_output_group AS val, train_output_summary AS val_names;

カテゴリ値の変数名と重要度がリストになっているかどうかを確認してください。
SELECT * FROM importance_table;

OUTLOOKとwindyがリストになっているはずです。

次に、連続値の変数をリストに加えます。
INSERT INTO importance_table
SELECT regexp_split_to_table(val_names.con_features, '.') AS con_features,
unnest(val.con_var_importance) AS con_importance
FROM train_output_group AS val, train_output_summary AS val_names;

再度、リストを確認してみてください。
SELECT * FROM importance_table;

temperatureとhumidityが追加されているはずです。


以上です。
データ分析、データの活用、ビッグデータなどが注目される今日ですが、データ分析の難しいところは・・・、いくつかありますが、

難しい(と思われる)現象をいかにしてわかりやすくみせるか

というとこです。でも、世の中にはその難しそうなものをわかりやすく見せてくれる仕事をしてくれている人がいます。David McCandlessさんもその一人で、彼のTEDでのトークはなかなか面白いです。

データビジュアリゼーション(データの可視化)

これはデータを理解するために必要な第一のステップになります。データはあるけど、

どんなデータなのかなぁ?
どういう傾向やパターンを持ってるのか、わかんない。
とりあえず集めたけど、何がみつかるのか、全く検討がつかない。

なんだか⬆同じようなことを述べてますが、こういう場合にビジュアリゼーションは非常に有効なツールとなります。ぜひ、Davidさんのビジュアリゼーションをご覧ください。動画は下のDavidさんの画像をクリック!




またまた見つけました。こちらのほうがキレイにできてる気がします。

こういうの、作るのにどれくらいの時間をかけてるんでしょうね。

動画はこちら。


ちなみに色は、どういう目的で個々人が移動をしているか、です。何時なのかは左上に出ています。

ニューヨークシティの一日の人の動きをアニメーションで描いた、という内容の記事が紹介されていました。アメリカの学生さんが作ったものらしいですよ。

動画はこちらから。

色が違うのは、人がどのような交通手段(歩き、自転車、車など)で移動しているかを示しています。簡単な英語で凡例がついていますので、見てみてください。
ニューヨークで、アメリカで、世界で活躍する日本人がいるというのは、嬉しいですね。
ニューヨークの犯罪を減らす。そんなことができるのか?
その答えはこちらの動画をどうぞ。

動画はこちら



年収1億円を稼ぐ人に変わる40のリスト


という記事が出てました。Facebookその他で、僕の知り合いが何人もシェアしてましたので、僕もそれにつられて、ここでシェアさせていただきます。

参考にしたいですね~。1億円稼ぐかどうかは別として、よりできることが増え、より魅力的な自分になるのは、誰しも願うことではないでしょうか。

1億円稼いだら、税金対策もしないとね~、など、妄想でもいいので、1億円稼いでいる自分を想像し、何を考えどう行動しているか、考えてみるのは非常に価値あることです。バカらしいと思うかもしれませんが、やってみたらいいと思います。意外と楽しいですし、新しい発見がたくさんあると思います。