ورود

View Full Version : train_test



hhamidy
چهارشنبه 03 تیر 1394, 17:52 عصر
سلام.

http://www.uplooder.net/cgi-bin/dl.cgi?key=b44db79c07b83ae6cd72f753ac38e749

من برای تبدیل دیتای اصلی برنامه به دو دسته ی ترین و تست به اینصورت عمل می کردم:


load('i.mat')
Label=y';
idx = randperm(numel(Label));

X1_R = X1(idx,:);
Label_R = Label(idx);

idx_0 = find(Label_R==0);
idx_1 = find(Label_R==1);
trainnum = 300;

Trainsample1 = X1_R(idx_0(1:trainnum),:);
Trainlabel1 = Label_R(idx_0(1:trainnum));

Trainsample2 = X1_R(idx_1(1:trainnum),:);
Trainlabel2 = Label_R(idx_1(1:trainnum));

Trainingsample = [Trainsample1; Trainsample2];
Traininglabel=[Trainlabel1; Trainlabel2];

%% سوالم مربوط به این بخش است:
Testsample1 = X1_R(idx_0(trainnum+1:400),:);
Testlabel1 = Label_R(idx_0(trainnum+1:400));

% Testsample1 = X1_R(idx_0(trainnum+1:end),:);
% Testlabel1 = Label_R(idx_0(trainnum+1:end));

Testsample2 = X1_R(idx_1(trainnum+1:400),:);
Testlabel2 = Label_R(idx_1(trainnum+1:400));

Testinglabel = [Testlabel1; Testlabel2];
Testingsample = [Testsample1; Testsample2];

قصدم این بود که دیتای ترین یه تعدادی از دیتاهای اصلی باشن با تعداد صفر و یک برابر و همینطور برای تست هم یه سری دیگه از همین دیتاهای اصلی ولی باز اونها هم تعداد صفر و یکشون برابر باشه.
الان با استفاده از این دیتا که میزان یک اون بسیار کم هست(423 عدد).

متوجه شدم که ترین رو دارم درست میگیرم ولی تست رو به جای اینکه بنویسم غیر از این ترین ها باشه تعدادش رو از اون trainnum به بعد گذاشتم.
حالا نمیدونم اینکه بگم مخالف با مجموعه ی ترین باشه و از طرفی از مجموعه ی اصلی وبا تعداد صفر ویک برابر باشه رو چطور بنویسم.

rahnema1
چهارشنبه 03 تیر 1394, 21:23 عصر
سلام
ببینید همین طور که قبلا گفتم بهتره عکسی را انتخاب کنید که تعداد پیکسلهای سفید با سیاه برابر باشه چون ممکنه همین عدم تعادل در نتیجه تاثیر بذاره

hhamidy
چهارشنبه 03 تیر 1394, 21:28 عصر
سلام
ببینید همین طور که قبلا گفتم بهتره عکسی را انتخاب کنید که تعداد پیکسلهای سفید با سیاه برابر باشه چون ممکنه همین عدم تعادل در نتیجه تاثیر بذاره

ممنون.

حالا مثلا اگر تصویری باشه که تعداد پیکسل های سیاه و سفید متناسب هست اونوقت اگر بخوام طوری باشه که این train ها از testها کاملا متمایز باهش ولی برای هر کدوم هم میزان صفر و یک یکسان باشه چیکار باید کرد؟

مثل الان، اگر خواستید حالا نمونه ای ببینید دیتا رو هم آپلود کردم:

http://www.uplooder.net/cgi-bin/dl.cgi?key=c57e564a0953d33c9d37e4d5d86317ce

rahnema1
چهارشنبه 03 تیر 1394, 21:48 عصر
شما دو سوم را برای آموزش و یک سوم را برای آزمایش بذارید به این شکل:

y = y';
dataSize = numel(y);
idx = randperm(dataSize);
y = y(idx);
X1 = X1(idx, :);
trainSize = uint32(dataSize) * 2 / 3;
testSize = dataSize - trainSize;
trainX = X1(1:trainSize, :);
testX = X1((trainSize + 1) : end, :);
trainY = y(1:trainSize);
testY = y((trainSize + 1) : end);

hhamidy
چهارشنبه 03 تیر 1394, 21:54 عصر
شما دو سوم را برای آموزش و یک سوم را برای آزمایش بذارید به این شکل:

y = y';
dataSize = numel(y);
idx = randperm(dataSize);
y = y(idx);
X1 = X1(idx, :);
trainSize = uint32(dataSize) * 2 / 3;
testSize = dataSize - trainSize;
trainX = X1(1:trainSize, :);
testX = X1((trainSize + 1) : end, :);
trainY = y(1:trainSize);
testY = y((trainSize + 1) : end);


خوبه ولی وقتی مثلا داده هامون خیلی زیاده خیلی زمانبور میشه.
حالا اگر بخوایم دقیقا یکسان از صفر و یک داشته اشن، هم تستها وهم ترین ها اونوقت چی؟

rahnema1
چهارشنبه 03 تیر 1394, 21:58 عصر
همین الان هم با احتمال یکسان داری صفر و یک هستند سرعتش هم خوبه

hhamidy
چهارشنبه 03 تیر 1394, 22:06 عصر
همین الان هم با احتمال یکسان داری صفر و یک هستند سرعتش هم خوبه

نه الان چطور برابر میشه؟
ما که براش شرصز تعیین نکردیم که.
میخوام یه شرطی باشه که دقیقا یکسان بهشون برسه، بعدم من قصد ندارم یک سوم و دو سوم بگیرم.
مثلا میخوام از یه ماتریس عظیم(قراره چند تا ماتریس رو تو کارم به هم وصل کنم)، همش ازشون 1000تا رو ترین بگیره بعد مثلا واسه ی 4000 تام تست کنه.این تعداد خیلی مهم نیست(من دارم حدود ی وکم میگم).
حالا مثلا بخوایم از این 1000 تا 500تاش صفر باشه 500تاش یک.
و از این 4000تا هم 2000تاش صفر باشه و 2000تاش یک و اصلا هم این داده ها یکی نباشن(مثل الان که از هم کمشون کردید).
اونوقت چی؟

rahnema1
چهارشنبه 03 تیر 1394, 22:12 عصر
با همون randperm که استفاده کردیم باعث شد که احتمال صفر و یک در داده ها مساوی بشه

hhamidy
چهارشنبه 03 تیر 1394, 22:18 عصر
با همون randperm که استفاده کردیم باعث شد که احتمال صفر و یک در داده ها مساوی بشه

چطور randperm این کار رو انجام میده؟

مگه randperm فقط عناصر ماتریس رو جابجا نمیکنه؟

rahnema1
چهارشنبه 03 تیر 1394, 22:27 عصر
جابجا می کنه اما این جابجایی به صورت رندومه
به طوری که شما هر زیر مجموعه ای از این آرایه جابجا شده انتخاب کنید احتمال صفر ها و یک ها برابر می شه!

hhamidy
چهارشنبه 03 تیر 1394, 22:31 عصر
جابجا می کنه اما این جابجایی به صورت رندومه
به طوری که شما هر زیر مجموعه ای از این آرایه جابجا شده انتخاب کنید احتمال صفر ها و یک ها برابر می شه!

حالا این درصدی که گفتین رو نخام بگیرم طبق خمون که پرسیدم بالاتر 1000تا و 4000تا چطور؟

rahnema1
چهارشنبه 03 تیر 1394, 22:36 عصر
متوجه نمی شم منظورتون چیه . بعد از اینکه randperm استفاده کردید با اندیس مثلا 1:1000 برای یکی و اندیس 1001 تا 4000 هم واسه اون یکی

hhamidy
چهارشنبه 03 تیر 1394, 22:46 عصر
متوجه نمی شم منظورتون چیه . بعد از اینکه randperm استفاده کردید با اندیس مثلا 1:1000 برای یکی و اندیس 1001 تا 4000 هم واسه اون یکی

اینطوری میگم.مثلا نوشتیم:

dataSize = numel(Label);
idx = randperm(dataSize);
Label = Label(idx);
X1 = X1(idx, :);

trainSize = 1000;

خب
حالا الان میخوام بگم 4000تای دیگه غیر از اون قبلیا بشه تست.
اینکه میگیم :
testSize = dataSize - trainSize;
خیلی خوبه ولی اینکه فقط 4000تاش باشه چی؟

مشکلم کلا از اول همینه.(اینکه هم اینا نصف باشه نسبتشون که خب بودن، من علاوه بر randperm اون شکلی نوشته بودم که دقیقا یکسان صفر و یک داشت)
ایده ی شما خلی خوبه که میفرمایید منها کنم این رو از هم ولی میگم مثلا اگر بخوام تعدادی باشه 1000تاشو بر دارم اونوقت مثلا 50000تا منهای این هزارتا میشه 49000 تا وخیلی زیاده.
میخوام هم غیر از اون هزارتا باشه این تستا و هم نه اینکه کل بقیشون باشه .
فقط 4000تا از بقیش بشه چطور میشه؟

ببخشید خیلی وقتتونو گرفتم.

rahnema1
چهارشنبه 03 تیر 1394, 22:50 عصر
ببینید تعداد داده های train لازمه بیشتر از تعداد داده تست باشه. الان شما 1000 تا واسه trainو 4000 تا واسه test می خواهید

hhamidy
چهارشنبه 03 تیر 1394, 22:57 عصر
ببینید تعداد داده های train لازمه بیشتر از تعداد داده تست باشه. الان شما 1000 تا واسه trainو 4000 تا واسه test می خواهید

بله شما فکر کنید من فقط همینقدر میخوام.
بیشترم نه..

rahnema1
چهارشنبه 03 تیر 1394, 23:02 عصر
حالا شما به عنوان تمرین همین را بنویسید ببینم چیکار می کنید
یک داده دارید مثلا یک در 50000
ابتدا با randperm به هم بریزید
سپس 1000 تا از ابتدای اون را بردارید
سپس 4000 تا داده را بعد از اون هزار تای اولی بردارید

hhamidy
چهارشنبه 03 تیر 1394, 23:07 عصر
حالا شما به عنوان تمرین همین را بنویسید ببینم چیکار می کنید
یک داده دارید مثلا یک در 50000
ابتدا با randperm به هم بریزید
سپس 1000 تا از ابتدای اون را بردارید
سپس 4000 تا داده را بعد از اون هزار تای اولی بردارید

ای بابا میگم که، این سوال ابتدایی من بود
وگرنه کد منکه داره تا همینجا کار میکنه.
شما به نوع دیگه نوشتینش.

rahnema1
چهارشنبه 03 تیر 1394, 23:11 عصر
آخرش سر از کار شما در نیاوردیم :متفکر:
بگذریم...

hhamidy
چهارشنبه 03 تیر 1394, 23:32 عصر
آخرش سر از کار شما در نیاوردیم :متفکر:
بگذریم...

سر از کار من در نیاوردین؟

شما که تو پست بالایی کاملا مشخصه که متوجه شدین من سوالم چیه؟

حالا از چی میگذرین:)