忍者ブログ
統計、機械学習、AIを学んでいきたいと思います。 お役に立てば幸いです。

【Julia】Juliaでの条件分岐(if 〜 elseif 〜 else)の基本手順

プログラムの中で「もし○○ならAの処理、そうでなければBの処理」というように、条件に応じて動きを変えたいときに使うのが条件分岐です。今回はJuliaにおける条件分岐の基本文法と、正しい記述手順について解説します。

※本記事の手順は、MacBook Air(macOS 15.7.7)の環境にて実際に動作を確認したログをベースに作成しています。

1. 【 概要 】

Juliaの条件分岐は、`if` で始まり、最後は必ず `end` で締めくくるというルールがあります。また、複数の条件を重ねたい場合は、Pythonのような「elif」ではなく、`elseif` と一続きで記述するのがJuliaの文法的な特徴です。今回はこの構文の基本を整理します。


2. 【 基本手順 】

(1) `if 条件式` を書き、その条件が正しい(true)ときの処理を記述する
(2) 別の条件を追加したい場合は `elseif 条件式` を使って繋げる
(3) どの条件にも合わない場合の処理を `else` の下に記述する
(4) 構文の最後には必ず `end` を記述して、条件分岐の範囲を閉じる

3. 整理:各ステップの具体的な処理内容

Juliaの条件分岐を正しく書きこなすためのポイントを、ステップごとに具体的に見ていきましょう。

【 条件分岐構文の具体的な処理内容 】

ステップ(1):if の記述
最初の条件を指定します。Juliaでは `if` のあとに括弧 `( )` を書く必要はありません。
条件式の後ろで改行し、条件が成立したときに行いたい処理を記述します。

ステップ(2)&(3):elseif と else の追加
2つ目以降の条件がある場合は `elseif` を使います。ここを `elif` や `else if` とスペースを空けて書くと文法エラー(SyntaxError)になるため注意しましょう。
すべての条件に当てはまらなかった場合の受け皿として、最後に `else` を配置します。

ステップ(4):end で閉じる
Juliaの構文において最重要とも言えるステップです。
`if` 構文の終わりには、必ず単独で `end` を記述して「ここまでがif文の範囲である」ことをコンピュータに伝えます。

4. 関連して押さえたい「Juliaの条件式における注意点(厳密な型チェック)」

他のプログラミング言語(C言語やJavaScriptなど)では、数値の `1` を「正しい(true)」、`0` を「間違い(false)」とみなして `if` 文に放り込めるものもあります。

しかし、Juliaは型に対して非常に厳密な言語です。`if` や `elseif` の後ろに続く条件式の結果は、必ず純粋な論理値である **`true`(真)か `false`(偽)** にならなければなりません。

例えば、`if 1` のように数値をそのまま条件式に書くとエラー(TypeError)になります。必ず `if x == 1` や `if score >= 80` のように、比較演算子を使って結果が `true` か `false` になる式を記述するようにしましょう。この厳密さが、予期せぬバグを防ぎ、Juliaの高速な実行速度を支える基盤になっています。


5. 補足:実際のターミナル操作ログ

対話型環境(REPL)を起動し、いくつか条件分岐のコードを実行した際の実際の操作ログです。
画面上でパッと見て構造が分かりやすいよう、短く改行を挟みながら入力しています。

% julia

# パターン1:最もシンプルな if 〜 end
julia> score = 85
85

julia> if score >= 80
           println("合格です!")
       end
合格です!

# パターン2:elseif と else を含んだ複数条件分岐
julia> temperature = 18
18

julia> if temperature >= 30
           println("暑いです")
       elseif temperature >= 15
           println("快適です")
       else
           println("寒いです")
       end
快適です

julia> exit()
%

6. まとめ

Juliaにおける条件分岐の基本手順をマスターしました。`if` から始まり `elseif` で条件を繋げ、最後に `end` で美しく閉じるという一連のルールは、このあとに学ぶループ処理(for文やwhile文)など、Juliaのあらゆる構文の土台となります。型チェックの厳密さに気をつけながら、状況に応じて賢く動くプログラムを組み立てていきましょう!


PR

【DS検定対策】Kaggleでも大人気!最強の直列アルゴリズム「勾配ブースティング」

前のモデルが犯したミスを、次のモデルが引き継いで集中修正していく。この「リレー」のような仕組みで驚異的な予測精度を叩き出すのが、勾配ブースティングです。

1. 【 問題 】

アンサンブル学習の代表的な手法の一つであり、決定木などの弱い予測モデル(弱学習器)を一つずつ順番に(直列に)構築し、前のモデルが出した予測値と正解との「誤差(勾配)」を、次のモデルが修正するように学習を繰り返すことで、最終的に非常に高い予測精度を得る機械学習アルゴリズムを何と呼ぶでしょうか?

① 勾配ブースティング(Gradient Boosting)
② バギング(Bagging)
③ 主成分分析(PCA)
④ K-means法


2. 【 解答 】

正解: ① 勾配ブースティング(Gradient Boosting)

3. 整理:バギングとブースティングの決定的違い

試験で最も狙われるのは、先ほど学んだ「バギング」とのアーキテクチャ(構造)の違いです。ここを完全に区別しておきましょう。

手法名学習の進め方(アーキテクチャ)統計学的な狙い(強み)
バギング
(前回)
複数のモデルを「並列」に同時に作り、最後に全員の平均や多数決をとる。
(例:ランダムフォレスト)
モデルの過学習を抑え、予測の「ブレ(分散・バリアンス)」を下げるのが得意。
ブースティング
★今回の主役
モデルを「直列(順番)」に作り、前のモデルのミス(残差)を次のモデルが追いかける。 モデルの表現力を高め、予測の「的外れさ(バイアス)」を極限まで下げるのが得意。

4. 実務で使われる超有名ライブラリたち

「勾配ブースティング」というアルゴリズムは、実務やKaggleなどのコンペにおいて以下のような超強力な進化系ライブラリとして実装され、表形式データの予測で無双しています。

XGBoost: 勾配ブースティングを一躍有名にした、高速・高精度な歴史的名作。
LightGBM: Microsoftが開発。データのスキャン方法を工夫することで、計算速度とメモリ効率を劇的に進化させた現代の主役。


5. DS検定形式:実戦4択クイズ

問:勾配ブースティングは非常に強力なアルゴリズムですが、学習(イテレーション)を際限なく繰り返してしまうと、どのような問題(不具合)が発生しやすくなるか。最も適切なものを一つ選べ。

① アンダーフィッティング(学習不足)   ② 勾配消失問題   ③ 過学習(オーバーフィッティング)   ④ 多重共線性(マルチコ)

【 正解: ③ 】

解説: ブースティングはミスを執拗に追いかけて修正していくため、繰り返し回数を多くしすぎると、訓練データに含まれる細かいノイズまで完璧に合わせにいってしまい、過学習(オーバーフィッティング)を起こします。これを防ぐために、テスト誤差が下がらなくなった時点で学習を強制終了する「早期終了(Early Stopping)」というテクニックが実務では必須になります。


6. まとめ

DS検定において「前のモデルの誤差・勾配を後ろのモデルが順番に修正して強くなる」という記述が出たら「勾配ブースティング」です。バギング(並列)との違い、そして過学習を抑えるための周辺技術とセットで頭を整理しておきましょう!

【DS検定対策】JSONやXMLの正体!「半構造データ」の特徴とメリット

リレーショナルデータベース(RDB)のテーブルのようにカチッと決まった枠はないけれど、テキストファイルとも違う。柔軟性と扱いやすさを両立したのが「半構造データ」です。

1. 【 問題 】

データサイエンスで扱うデータの分類において、リレーショナルデータベースのテーブルのように「すべてのデータに共通する厳密な定義(スキーマ)」は存在しないものの、各データがタグやキーなどの自己記述的な構造(スキーマ)を内部に持っているデータ形式を何と呼ぶでしょうか?

① 構造化データ
② 半構造データ
③ 非構造化データ
④ メタデータ


2. 【 解答 】

正解: ② 半構造データ

3. 整理:3つのデータ形式の違いと具体例

試験や実務では、データを「構造化」「半構造」「非構造」の3つに明確にキャラクター分けして整理しておくことが鉄則です。

データの分類スキーマ(構造)の特徴具体的なデータ形式
1. 構造化データ あらかじめ厳密に定義された枠組み(スキーマ)に従って、行と列にきれいに収まっているデータ。 RDB(関係データベース)のテーブル、CSV、Excelファイルなど。
2. 半構造データ
★今回の主役
全体を一律に縛る枠はないが、データ自身の中に「キー」や「タグ」などの構造(メタデータ)が含まれているデータ。 JSONXML、WebサイトのHTML、設定ファイル(YAML)など。
3. 非構造化データ 定型的なルールや構造を一切持たない、生のデータ。そのままではRDB等に格納して集計することが難しいデータ。 画像、音声、動画、自然言語のテキスト(メール本文や書籍)など。

4. なぜ今「半構造データ」が重要なのか?

WebサービスのAPI通信や、IoTセンサーから送られてくるログデータなどは、そのほとんどがJSON(半構造データ)でやり取りされます。
「ユーザーによって持っている属性情報(カラム)がバラバラ」「後から新しい項目を急に追加したい」といった場合でも、RDBのように `ALTER TABLE` でシステムを止めたりスキーマ変更をしたりする必要がなく、データをそのまま柔軟に吸い込める(高い拡張性を持つ)という点が、モダンなシステム開発やデータ収集において最大の強みとなっています。


5. DS検定形式:実戦4択クイズ

問:半構造データの代表例である「JSON」の記述ルールに関する説明として、最も適切なものはどれか。

① データを「<tag>データ</tag>」のように、カスタムタグで挟むことで構造を表現する。
② データを「"キー" : 値」のペア(Key-Valueペア)の形式で記述し、全体を中括弧 { } や大括弧 [ ] で囲んで表現する。
③ カンマ(,)で区切られたデータ行のみで構成され、階層構造を表現することはできない。
④ バイナリ形式のデータであり、テキストエディタで直接中身を読んで編集することはできない。

【 正解: ② 】

解説: まさにJSON(JavaScript Object Notation)の基本定義です。ちなみに①はXMLの説明、③はCSVの説明です。JSONはテキスト形式でありながら複雑な階層構造(ネスト)を表現できるため、半構造データの王座に君臨しています。


6. まとめ

DS検定において「全体の共通スキーマはないが、個々にスキーマを持っているデータ」という非常に精緻な問題文が出たら「半構造データ(JSONやXML)」の事です。構造化データへの前処理(パース)やNoSQLデータベースの文脈でも必ずセットで問われる知識ですので、その柔軟なメリットをしっかり頭に叩き込んでおきましょう!

【DS検定対策】並列処理でブレを抑える!アンサンブル学習の王道「バギング」

機械学習モデルの予測性能を安定させる「アンサンブル学習」。その中でも、データをランダムに切り分けて複数のモデルを同時に(並列に)育てる手法がバギングです。

1. 【 問題 】

アンサンブル学習の代表的な手法の一つにおいて、元の訓練データからランダムに重複を許して一部のデータを抽出し(ブートストラップサンプリング)、それらを用いて複数のモデルを並列的に構築した上で、最終的な予測結果を平均(回帰の場合)や多数決(分類の場合)によって決定するアルゴリズムを何と呼ぶでしょうか?

① ブースティング(Boosting)
② バギング(Bagging)
③ スタッキング(Stacking)
④ ドロップアウト(Dropout)


2. 【 解答 】

正解: ② バギング(Bagging)

3. 整理:バギングの仕組みと最大のメリット

バギング(Bootstrap Aggregating)は、その名の通り「データを小分けのバッグ(Bag)に詰めて別々に学習させる」イメージです。

【 バギングの3ステップ 】

1. データの切り分け(並列準備):元のデータから、重複を許してランダムにデータを抜き出した「子データ」を大量に作成します。
2. 並列構築:それぞれの子データを使って、複数のモデル(決定木など)を完全に独立して並列に同時学習させます。
3. 総合(アグリゲーション):テストデータに対して全員で予測を行い、最後にその「平均」や「多数決」で一つの答えを出します。

ここがメリット:「バリアンス(分散・ブレ)を下げる」
1つのモデルだけに学習させると、手元のデータに過剰に適合してしまい(以前学んだ過学習)、新しいデータに対して予測値が激しくブレる傾向があります。バギングは、並列に作った多くのモデルの意見を総合してマイルドに平均化するため、モデルの過学習を抑え、未知のデータに対する堅牢性(ロバスト性)を劇的に高めることができます。


5. DS検定形式:実戦4択クイズ

問:バギングの仕組みをベースに、変数の選択(特徴量の抽出)にもランダム性を加えることで、決定木同士の相関を下げて予測精度をさらに向上させた、データサイエンスで非常によく使われる代表的な機械学習アルゴリズムはどれか。

① 主成分分析   ② ロジスティック回帰   ③ ランダムフォレスト   ④ サポートベクターマシン

【 正解: ③ 】

解説: バギングの最も有名な応用例が「ランダムフォレスト」です。データだけでなく「使う変数」までモデルごとにランダムに制限することで、個々の木が全く異なる個性を持ち、それらを並列で組み合わせることで極めて強力な「森(フォレスト)」を作り上げます。


6. まとめ

DS検定において「並列的にモデルを構築して平均や多数決を用いる」というキーワードが登場したら、それは「バギング」の性質を指します。実務のデータコンペ(Kaggleなど)でも、モデルのブレを抑えて手堅くスコアを安定させるための大基本となる戦略ですので、直列処理のブースティングとの違いとセットで確実にマスターしておきましょう!


【DS検定対策】高次元へ飛ばしてスパッと切る!SVMと「カーネル法」の魔術

直線や平面ではどうしても2つのグループに切り分けることができない複雑なデータ。それを数理の力で鮮やかに分類できるようにするのが、サポートベクターマシンの「カーネル法」です。

1. 【 問題 】

サポートベクターマシン(SVM)において、直線や平面では綺麗に分類できない「非線形分離」なデータに対し、データをより高次元の空間へと写像(マッピング)することで、線形分離(直線や平面での分割)を可能にする手法を何と呼ぶでしょうか?

① カーネル法
② 勾配降下法
③ ステップワイズ法
④ 主成分分析


2. 【 解答 】

正解: ① カーネル法

3. 図解イメージ:高次元へ飛ばすとはどういうことか?

2次元(平面)ではどう頑張っても直線1本でセパレートできない「ドーナツ型」のデータを例に、カーネル法の魔法を視覚的に整理してみましょう。

元の空間(2次元平面)カーネルトリック後の空間(3次元空間)
・中心に「グループA(●)」がある。
・その周りを「グループB(✖)」が囲んでいる。

【悩み】
まっすぐな直線(線形)をどこに引いても、●と✖を1本で完全に切り離すことは不可能です。
・カーネル関数を使い、データを「縦・横」だけでなく「高さ(Z軸)」の次元を追加した3次元空間にマッピングします。

【結果】
中心の●だけがポコッと上に浮き上がり、周りの群が下に残るため、間を「1枚の平らな紙(平面)」でスパッと水平に切り分ける(線形分離)ことができるようになります!

ここが天才的:「カーネルトリック」
実際に高次元のめんどくさい座標計算を真面目にやると、計算量が爆発してフリーズしてしまいます。しかし、カーネル法では「高次元に移動した後のデータ同士の内積」を、元の次元のままで直接ショートカット計算できる関数(カーネル関数)を使います。これを「カーネルトリック」と呼び、深層学習が登場する前の機械学習界を席巻しました。


5. DS検定形式:実戦4択クイズ

問:サポートベクターマシン(SVM)において、データを2つのクラスに分類する境界線を決定する際、境界線に最も近い位置に存在する(境界線を支える目印となる)一部のデータ点のことを何と呼ぶか。

① サポートベクター   ② マージン   ③ カーネル係数   ④ スラック変数

【 正解: ① 】

解説: アルゴリズムの名の由来でもある「サポートベクター」です。SVMは、すべてのデータを覚えるのではなく、境界線のギリギリのキワにいる「サポートベクター」だけを基準にして境界線を引きます。そのため、以前に学んだ外れ値やノイズに対しても非常にタフ(堅牢 / ロバスト)であるという、美しい繋がりを持っています。


6. まとめ

DS検定において「非線形データを高次元に飛ばして線形分離する」「SVM」というキーワードが来たら「カーネル法」です。実務のデータコンペ(Kaggleなど)でも、データ構造によっては非常に強力な選択肢となるクラシックな名手法ですので、その幾何学的なイメージをしっかり押さえておきましょう!