★AIと作成すれば、プログラムを知らなくても、作成できる
最近は、AIがやたら、広告で放送されています。
AIを知らなければ、仕事がなくなる可能性があります。
難しい、わからない、できない、ではありません。
プログラムを知らなくても、機械学習システム作成できるようにしましょう。
★機械学習をするための準備
前回は、SQLiteでテーブルを作成するところまで解説しました。
では、今回は、機械学習をするために、大量のデータをアップロードしなければなりません。
その際のアップロードの方法等を今回は解説しています。
機械学習をするためには、10万件位のデータが必要になります。
ここがネックでした。
データは、あるもののCSVを作成するのは結構面倒でした。
では、そんな悩みを解決します。
このブログはこんな人にお勧め
- 機械学習システムを作成したい人
- AIを利用したいけど、やり方がわからない人
- 競馬を、投資に変えたい人
このブログを読み終わる頃には・・・・・・
大量のデータをアップロードするときは、エラーがつきものです。
しかし、AIが理解できるように質問すると、AIが、完璧なコードを提示してくれます。
質問の方法を覚えましょう。
★ACCESSから、アップロード用のCAVを作成
先にこのようなデータを、作成します。
データ件数は、195,745件です。
ACCESSの基本機能で、CSVファイルを作成すると、65,000件までしか作成出ません。
結構面倒・・・・・・・
今までは、ACCESSの基本機能で作成していたのですが、ここもAIに確認しました。
サクッとVBAのコードを提示してくれました。
Public Sub ExportQ_KOLtoCSV_UTF8()
Dim strSQL As String
Dim strFilePath As String
Dim fso As Object
Dim ts As Object
Dim rs As DAO.Recordset
Dim i As Integer
Dim line As String
' 出力先のファイルパス
strFilePath = "C:\Users\tekis\Desktop\conpi_data.csv"
' クエリを開く
Set rs = CurrentDb.OpenRecordset("Q_コンピ", dbOpenSnapshot)
' FileSystemObjectを使用してUTF-8で書き込み
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.CreateTextFile(strFilePath, True, True) ' 第3引数 True = UTF-8
' ヘッダー出力
For i = 0 To rs.Fields.Count - 1
line = line & rs.Fields(i).Name & IIf(i < rs.Fields.Count - 1, ",", "")
Next
ts.WriteLine line
' データ出力
Do While Not rs.EOF
line = ""
For i = 0 To rs.Fields.Count - 1
line = line & """" & Replace(Nz(rs.Fields(i).Value, ""), """", """""") & """" & IIf(i < rs.Fields.Count - 1, ",", "")
Next
ts.WriteLine line
rs.MoveNext
Loop
' 終了処理
ts.Close
rs.Close
Set rs = Nothing
Set ts = Nothing
Set fso = Nothing
MsgBox "CSVファイルの出力が完了しました:" & vbCrLf & strFilePath, vbInformation
End Sub
コードは、Q_コンピというクエリのデータを変換するコードです。
19万件のデータをpythonで転送
下記のデータをSQLiteにアップします。
C:\Users\tekis\Desktop\conpi_data.csv
UTF-8に書き換えて、C:\Users\tekis\Desktop\に別名で保存してください
そして、UTF-8で記載されているか確認してください。
そのデータがUTF-8であれば、SQLiteのG_CONPへ、転記してください。
pythonでお願います。
CSVのヘッダーは下記の通りです
レースID馬 レースID レース番号 場所 クラス 芝・ダ 距離 頭数 枠 ゼッケン コンピ指数 コンピ能力 能力 T着順 単勝 複勝
202102130501050101 2021021305010501 01 東京 未勝利 ダ 1400 1 01 55 6 0 16
G_COMPIのテーブルの構造は下記の通りです
CREATE TABLE G_CONPI (
race_id_horse TEXT PRIMARY KEY,
race_id TEXT,
race_number INTEGER,
racecourse TEXT,
race_class TEXT,
track_type TEXT,
distance INTEGER,
number_of_horses INTEGER, — NULLあり
frame_number INTEGER,
horse_number TEXT,
compi_index TEXT, — 文字列
compi_ability TEXT, — 文字列(順位)
ability INTEGER, — 推奨馬の順位
finish_position INTEGER,
win_odds REAL,
place_odds REAL,
win_popularity INTEGER
);
AIが提示したpythonのコードです
import pandas as pd
import sqlite3
import chardet
import os
# ファイルパス
input_file = r"C:\Users\tekis\Desktop\conpi_data.csv"
output_file = r"C:\Users\tekis\Desktop\conpi_data_utf8.csv"
db_file = r"D:\SQLlite\sqlite-tools-win-x64-3490100\keiba.db" # SQLiteパスを指定
# 1. CSVを読み込み、UTF-8で保存
# 元ファイルのエンコーディングを自動検出
with open(input_file, 'rb') as f:
result = chardet.detect(f.read())
original_encoding = result['encoding']
print(f"元のエンコーディング: {original_encoding}")
# Pandasで読み込み
df = pd.read_csv(input_file, encoding=original_encoding)
# ヘッダーを確認
expected_headers = [
"レースID馬", "レースID", "レース番号", "場所", "クラス", "芝・ダ", "距離", "頭数",
"枠", "ゼッケン", "コンピ指数", "コンピ能力", "能力", "T着順", "単勝", "複勝"
]
if list(df.columns) != expected_headers:
print("警告: ヘッダーが期待と異なる可能性があります")
print(f"実際のヘッダー: {list(df.columns)}")
# UTF-8で保存
df.to_csv(output_file, encoding='utf-8', index=False)
print(f"UTF-8で {output_file} に保存しました")
# 2. UTF-8確認
with open(output_file, 'rb') as f:
result = chardet.detect(f.read())
utf8_check = result['encoding']
print(f"保存後のエンコーディング: {utf8_check}")
if 'utf-8' in utf8_check.lower():
print("ファイルはUTF-8で正しく保存されています")
else:
print("警告: UTF-8ではない可能性があります")
exit()
# 3. SQLiteに転記
# カラム名をG_CONPIテーブルに合わせる
df.columns = [
"race_id_horse", "race_id", "race_number", "racecourse", "race_class",
"track_type", "distance", "number_of_horses", "frame_number", "horse_number",
"compi_index", "compi_ability", "ability", "finish_position", "win_odds", "place_odds"
]
# win_popularityがないのでNULLとして追加
df['win_popularity'] = None
# SQLite接続
conn = sqlite3.connect(db_file)
cursor = conn.cursor()
# テーブル作成(既存の場合は上書き)
cursor.execute("""
CREATE TABLE IF NOT EXISTS G_CONPI (
race_id_horse TEXT PRIMARY KEY,
race_id TEXT,
race_number INTEGER,
racecourse TEXT,
race_class TEXT,
track_type TEXT,
distance INTEGER,
number_of_horses INTEGER,
frame_number INTEGER,
horse_number TEXT,
compi_index TEXT,
compi_ability TEXT,
ability INTEGER,
finish_position INTEGER,
win_odds REAL,
place_odds REAL,
win_popularity INTEGER
)
""")
# データ挿入(既存データを上書き)
df.to_sql('G_CONPI', conn, if_exists='replace', index=False)
print("データを G_CONPI テーブルに転記しました")
# データ確認(最初の5行)
cursor.execute("SELECT * FROM G_CONPI LIMIT 5")
rows = cursor.fetchall()
print("G_CONPIの最初の5行:")
for row in rows:
print(row)
# 接続を閉じる
conn.commit()
conn.close()
★学習させるデータをSQLiteに転送する
学習させるデータとは、当日の競馬のレースデータです。
これを、CSVに変換して、pythonでアップロードするのは面倒です。
だから、Excelから転送します。
ACCESSで、転送したいデータを作成する
ADOを利用して、転送データをExcelに転記する
Excelに転記したデータを、SQLiteへ転送する。
ACCESSから、SQLiteへ転送もできると思いますが、私は、様々な事情から、Excelから転送しています。
Excelから、SQLiteへの転送コードです。
Sub アップロードCONPI()
Dim conn As Object
Dim rs As Object
Dim sql As String
Dim ws As Worksheet
Dim lastRow As Long
Dim i As Long
Dim race_id_horse As String
Dim race_id As String
Dim race_number As Variant
Dim racecourse As String
Dim race_class As String
Dim track_type As String
Dim distance As Variant
Dim number_of_horses As Variant
Dim frame_number As Variant
Dim horse_number As String
Dim compi_index As String
Dim compi_ability As String
Dim ability As Variant
On Error GoTo ErrorHandler
Set conn = CreateObject("ADODB.Connection")
conn.Open "DRIVER=SQLite3 ODBC Driver;Database=D:\SQLlite\sqlite-tools-win-x64-3490100\keiba.db;"
Set ws = ThisWorkbook.ActiveSheet
' A列の最終行を検出(空白セルを考慮)
lastRow = 6
While ws.Cells(lastRow, "A").value <> ""
lastRow = lastRow + 1
Wend
lastRow = lastRow - 1 ' 最後の非空白行
Debug.Print "Last row: " & lastRow
Debug.Print "Rows to insert: " & (lastRow - 5)
' Create S_CONPI table if not exists
sql = "CREATE TABLE IF NOT EXISTS S_CONPI (" & _
"race_id_horse TEXT PRIMARY KEY, race_id TEXT, race_date TEXT, race_number INTEGER, " & _
"racecourse TEXT, race_class TEXT, track_type TEXT, distance INTEGER, " & _
"number_of_horses INTEGER, frame_number INTEGER, horse_number TEXT, " & _
"compi_index TEXT, compi_ability TEXT, ability INTEGER, s_hill REAL, " & _
"s_wood REAL, compi_deviation REAL, compi_90_prob TEXT, compi_top_prob TEXT);"
conn.Execute sql
' Begin transaction
conn.Execute "BEGIN TRANSACTION;"
For i = 6 To lastRow
race_id_horse = Replace(ws.Cells(i, 1).value, "'", "''")
race_id = Replace(ws.Cells(i, 2).value, "'", "''")
race_number = IIf(IsEmpty(ws.Cells(i, 3).value), "NULL", ws.Cells(i, 3).value)
racecourse = Replace(ws.Cells(i, 4).value, "'", "''")
race_class = Replace(ws.Cells(i, 5).value, "'", "''")
track_type = Replace(ws.Cells(i, 6).value, "'", "''")
distance = IIf(IsEmpty(ws.Cells(i, 7).value), "NULL", ws.Cells(i, 7).value)
number_of_horses = IIf(IsEmpty(ws.Cells(i, 8).value), "NULL", ws.Cells(i, 8).value)
frame_number = IIf(IsEmpty(ws.Cells(i, 9).value), "NULL", ws.Cells(i, 9).value)
horse_number = Replace(ws.Cells(i, 10).value, "'", "''")
compi_index = Replace(ws.Cells(i, 11).value, "'", "''")
compi_ability = Replace(ws.Cells(i, 12).value, "'", "''")
ability = IIf(IsEmpty(ws.Cells(i, 13).value), "NULL", ws.Cells(i, 13).value)
sql = "INSERT INTO S_CONPI (" & _
"race_id_horse, race_id, race_number, racecourse, race_class, track_type, " & _
"distance, number_of_horses, frame_number, horse_number, compi_index, " & _
"compi_ability, ability, race_date, s_hill, s_wood, compi_deviation, " & _
"compi_90_prob, compi_top_prob) VALUES (" & _
"'" & race_id_horse & "', " & _
"'" & race_id & "', " & _
race_number & ", " & _
"'" & racecourse & "', " & _
"'" & race_class & "', " & _
"'" & track_type & "', " & _
distance & ", " & _
number_of_horses & ", " & _
frame_number & ", " & _
"'" & horse_number & "', " & _
"'" & compi_index & "', " & _
"'" & compi_ability & "', " & _
ability & ", " & _
"'" & Left(race_id, 8) & "', " & _
"NULL, " & _
"NULL, " & _
"NULL, " & _
"NULL, " & _
"NULL)"
Debug.Print "SQL for row " & i & ": " & sql
On Error Resume Next
conn.Execute sql
If Err.Number <> 0 Then
Debug.Print "Error on row " & i & ": " & Err.Description
conn.Execute "ROLLBACK;"
MsgBox "Error on row " & i & ": " & Err.Description, vbCritical
conn.Close
Set conn = Nothing
Exit Sub
End If
On Error GoTo ErrorHandler
Next i
' Commit transaction
conn.Execute "COMMIT;"
' Verify inserted rows
Set rs = conn.Execute("SELECT COUNT(*) FROM S_CONPI;")
Dim insertedRows As Long
insertedRows = rs.Fields(0).value
Debug.Print "Total rows in S_CONPI: " & insertedRows
rs.Close
MsgBox "Data uploaded to S_CONPI successfully. Total rows: " & insertedRows, vbInformation
conn.Close
Set conn = Nothing
Exit Sub
ErrorHandler:
MsgBox "Error on row " & i & ": " & Err.Description, vbCritical
If Not conn Is Nothing Then
conn.Execute "ROLLBACK;"
conn.Close
End If
Set conn = Nothing
End Sub
番外編 作成した
PRAGMA table_info(S_race_results );⇒カラムを確認
SELECT COUNT(*) FROM wood_training ;⇒データ数を確認
コード、テーブルは、Excelで管理する
雑ではありますが、AIを利用して、機械学習システムを作成すると、AIはすべて、英語で記載してきます。
すべて英語なので、実行する順番や、なんのためのテーブルなのが、わからなくなります。
なので、上記のように、まとめておくと、次回の作業がカンタンにわかるので、お勧めします。
ここがポイント

入力規制は、絶対に必要です。AIは、上手に質問することで、正確なコードを提示してくれます。しかし、最後は、人間の目で確認しなければなりません。ここを怠ると、どんな立派なシステムも作動しません。
まとめ
ここまでで、何も知らない私でも、約6時間くらいでした。
初めてなので、仕方ないですが、次回からは、もっと早くなるでしょう