なのでTatanicの問題も出したくない!
だって同じ作業を何回もするのめんどくさいでしょ。
そもそもプログラムを始めた理由も中学生の時に連立方程式を解くのがめんどくさいからだったので。
いま思うと、この連立方程式のおかげで宿題が嫌いになり、プログラムができるようになりました。それよかったのかな?
そこで、今日は前回作ったtaitnicの問題の正解率を求めるプログラムを作ってみます。
ところで、Kaggleってどうやって正解率計算してるんだろね。
いろいろ調べると、どうやらtitanic3.csvというデータをネットからとってくると、タイタニックの乗客1310人全員のデータがあるらしい。
それをとってくれば100%正解のデータがつくれそうなので、正解率が求められそうです。
早速titatic3.csvのなかからtest.csvにいる人のデータを取ってきて答えを作ります。
手動でやるとめんどくさいので100%正解のデータを作るプログラムを作成。
答えを作成している途中にわかったんだけど、train.csvやtest.csvの名前のところのダブルコーテーションのエスケープ処理が間違っている。これ本当にtest.csv正しいのかな?
こういう変なところに時間を取られます。
出題者もデータの変換を間違うくらいなので、機械学習のプログラムって、データが間違っているのか、変換プログラムが間違っているのか、解析プログラムが間違っているのか、ほんとデバッグが大変。
いろいろあったけど、どうにか100%正解データ作成完了。
早速先日の自分の答えをチェックしてみます。
------------------------------------
.......
OK 1.000000 1.357631
OK -1.000000 -1.140641
OK -1.000000 -1.098839
NG 1.000000 -0.307569
ct=418 ok=326 77.990431%
------------------------------------
とりあえず僕の適当に作ったモデルの本当の正解率が求められました。
なるほど、お手本の解答から1.5%上がったのね。
先日アップしたコードや方法がとりあえず間違ってなさそうです。よかーったー。
でも成績が上位に入るためには正解率をあと2%あげないといけないのか。
とりあえずC言語でスクラッチで作ったSVMの計算プログラムやデータ変換プログラムが正しいことはわかった。
これでc言語だけで頑張ってデータ解析するスタートラインに立てました。
C言語でデータ解析ってどうやるんだろ。
続く。
------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static char *strtokrev(char *s1, int s2) {
static char *str = 0;
int f = 0;
if (s1)str = s1;
else s1 = str;
if (!s1)return NULL;
while (1) {
if (!*str) {
str = 0;
return(s1);
}
if (*str == '\r' || *str == '\n') {
*str = 0;
str = 0;
return(s1);
}
if (*str == '\"' && f == 0) {
str++;
s1 = str;
f = 1;
continue;
}
if (*str == '\"' && f == 1 && *(str + 1) == '\"') {
str += 2;
continue;
}
if (*str == '\"' && f == 1) {
*str++ = 0;
f = 0;
continue;
}
if (*str == s2 && f == 0) {
*str++ = 0;
return(s1);
}
str++;
}
}
char list[2000][20][80];
char list2[2000][20][80];
void read_list()
{
int i, j, c=0;
FILE *fp = NULL;
char buf[256];
char *p,*q;
fp = fopen("titanic3.csv","rt");
if (fp == NULL)goto end;
buf[0] = 0;
fgets(buf, sizeof(buf), fp);
while (1)
{
buf[0] = 0;
fgets(buf, sizeof(buf), fp);
if (buf[0] == 0)break;
for (i = 0; i < 11; i++){
p = buf;
if (i > 0)p = NULL;
q=strtokrev(p, ',');
if (q == NULL)q = "";
strcpy(list[c][i], q);
}
c++;
}
#if 0
for (i = 0; i < c; i++) {
printf("%d,%s,%s,\"%s\"\n",
892+i,list[i][0], list[i][1], list[i][2]);
}
#endif
end:
if (fp)fclose(fp);
}
void read_list2()
{
int i, j, c = 0;
FILE *fp = NULL;
char buf[256];
char *p, *q;
fp = fopen("test.csv", "rt");
if (fp == NULL)goto end;
buf[0] = 0;
fgets(buf, sizeof(buf), fp);
while (1)
{
buf[0] = 0;
fgets(buf, sizeof(buf), fp);
if (buf[0] == 0)break;
for (i = 0; i < 11; i++) {
p = buf;
if (i > 0)p = NULL;
q = strtokrev(p, ',');
if (q == NULL)q = "";
strcpy(list2[c][i], q);
}
c++;
}
#if 0
for (i = 0; i < c; i++) {
printf("%d,%s,%s,\"%s\"\n",
892 + i, list2[i][0], list[i][1], list[i][2]);
}
#endif
end:
if (fp)fclose(fp);
}
void print_test_list()
{
int i, j, pos;
printf("PassengerId,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked\n");
for (i = 0; i < 2000; i++) {
if (list2[i][2][0] == 0)break;
pos = -1;
for (j = 0; j < 2000; j++) {
if (strcmp(list2[i][2], list[j][2]) == 0 && strcmp(list2[i][7], list[j][7]) == 0) {
if (pos != -1) {
printf("okasii1!!!\n");
exit(1);
}
pos = j;
}
}
if (pos == -1) {
printf("okasii2!!!\n");
exit(1);
}
printf("%d,%s,\"%s\","
"%s,%s,%s,%s,"
"%s,%s,%s,%s"
"\n",
892 + i, list[pos][0], list[pos][2],
list[pos][3], list[pos][4], list[pos][5], list[pos][6],
list[pos][7], list[pos][8], list[pos][9], list[pos][10]
);
}
}
void print_result_list()
{
int i, j, pos;
printf("PassengerId,Survived\n");
for (i = 0; i < 2000; i++) {
if (list2[i][2][0] == 0)break;
pos = -1;
for (j = 0; j < 2000; j++) {
if (strcmp(list2[i][2], list[j][2]) == 0 && strcmp(list2[i][7], list[j][7]) == 0) {
if (pos != -1) {
printf("okasii1!!!\n");
exit(1);
}
pos = j;
}
}
if (pos == -1) {
printf("okasii2!!!\n");
exit(1);
}
printf("%d,%s\n",892 + i, list[pos][1]);
}
}
int main()
{
read_list();
read_list2();
//print_test_list();
print_result_list();
}
------------------------------------
0 件のコメント:
コメントを投稿