Каков наилучший способ обучения модели машинного обучения с прогнозированием цен для данных автомобилей с текстовыми и целочисленными значениями в файле CSV? - PullRequest
0 голосов
/ 15 февраля 2020

Спасибо, что пришли к этому сообщению, оно немного длинное, но я надеюсь, что оно того стоит. Я пытался, очень неудачно, я мог бы добавить, обучить модель машинного обучения прогнозированию цены автомобиля на основе записей в файле CSV. У меня есть около 200 000 строк данных в файле CSV, и каждая строка имеет различные записи. То, что я хочу сделать, это дать порцию, скажем, от 50 до 500 (возможно, больше или меньше, если это приведет к лучшим результатам) строк данных к тензорному потоку / керасу за один раз и попросить, чтобы он предсказал соответствующие цены для каждой строки (где каждый ряд представляет собой уникальную машину). Затем я хочу, чтобы модель видела правильную цену для каждой из строк в пакете, и затем пытаюсь предсказать цену для следующих 50–500 (опять, возможно, больше или меньше, чем эта) строк данных. Я хочу, чтобы этот процесс угадывания цен и последующего указания правильной цены продолжался для всей информации об обучении. Я полагаю, что этот процесс обучения будет довольно медленным, и для первых нескольких тысяч (или, возможно, даже для 10 тысяч +) рядов данных модель будет крайне неточно предсказывать правильную цену. Я надеюсь, что после того, как модель увидит все тренировочные данные, я смогу проверить ее точность с помощью тестовых данных, и я надеюсь, что модель будет достаточно точной для моих нужд. Я надеюсь, что я четко объяснил себе, чего я пытаюсь достичь.

Чтобы дать дополнительную информацию к этому сообщению, мой CSV-файл изложен следующим образом:

(автомобили, показанные ниже, просто некоторые записи взяты из CSV)

Обратите внимание, что в столбце «ВНИМАНИЕ ГРАББЕР» в столбце «ВНИМАНИЕ ГРАББЕР» нет информации, как показано двойной запятой после «168 миль». Это довольно часто для некоторых записей, которые не содержат никаких данных, и не ограничиваются этим столбцом.

CAR NAME, YEAR, MILEAGE, ATTENTION GRABBER, KEY SPECS, DESCRIPTION, URL, PRICE
Abarth 1.4 595 3d 144 BHP, 2018, 8000 miles, ASCARI 180 LIMITED EDITION, |2018 (18 reg)|Hatchback|8000 miles|1.4L|143bhp|Manual|Petrol|1 owner|Full service history|, VELOCES ARE VERY PLEASED TO PRESENT FOR SALE THIS AWESOME 595 ASCARI ABARTH …, https://www.autotrader.co.uk/classified/advert/201910173426267?model=595&sort=distance&make=Abarth&radius=1501&onesearchad=Used&onesearchad=Nearly%20New&onesearchad=New&advertising-location=at_cars&postcode=KY103AA&page=20, 11990
Alfa Romeo 159 Sportwagon 1.9 JTDM 16v TI Estate 5dr Diesel …, 2009, 100000 miles, RARE AUTO • TAN LEATHER • MINT, |2009 (09 reg)|Estate|100000 miles|1.9L|150bhp|Automatic|Diesel|, JUST ARRIVED IN STOCK A VERY RARE & SOUGHT AFTER ALFA ROMEO 159 TI 1.9 DIESEL …, https://www.autotrader.co.uk/classified/advert/201912095183372?model=159%20Sportwagon&sort=distance&make=Alfa%20Romeo&radius=1501&onesearchad=Used&onesearchad=Nearly%20New&onesearchad=New&advertising-location=at_cars&postcode=KY103AA&page=2, 5975
Alfa Romeo Giulia 2.0 TB 280 Veloce 4dr Auto, 2019, 168 miles,, |2019 (69 reg)|Saloon|168 miles|2.0L|276bhp|Automatic|Petrol|1 owner|, Alfa Romeo Giulia 2.0 TB 280 Veloce 4dr Auto White 1 owner £31000 Apple car …, https://www.autotrader.co.uk/classified/advert/202002087091280?model=Giulia&sort=distance&make=Alfa%20Romeo&radius=1501&onesearchad=Used&onesearchad=Nearly%20New&onesearchad=New&advertising-location=at_cars&postcode=KY103AA&page=12, 31000
Alfa Romeo Giulietta 1.4 MULTIAIR LUSSO TB 5d 170 BHP DNA …, 2012, 53610 miles, GREAT HISTORY, |2012 (62 reg)|Hatchback|53610 miles|1.4L|170bhp|Manual|Petrol|, BUY NOW PAY APRIL! FINANCE AVAILABLE  This vehicle is presented in excellent …, https://www.autotrader.co.uk/classified/advert/202001276642755?model=Giulietta&sort=distance&make=Alfa%20Romeo&radius=1501&onesearchad=Used&onesearchad=Nearly%20New&onesearchad=New&advertising-location=at_cars&postcode=KY103AA&page=25, 5250

Также обратите внимание, что информация в столбцах YEAR и MILEAGE также находится в столбце KEY SPECS, что потенциально делает эти столбцы совершенно неактуальными, поскольку данные уже есть без этих столбцов. Однако я решил включить их, так как я не уверен, как именно работает машинное обучение, и я не уверен, насколько хорошо модель сможет увидеть эти информационные точки в столбце KEY SPECS, поэтому я подумал, что это может быть полезно извлечь их и сделать новые столбцы для них. Если модель ML полностью способна видеть эту информацию из столбца ключевых спецификаций, то я мог бы просто удалить столбцы YEAR и MILEAGE. Еще одна вещь, которую стоит отметить, это то, что у каждого автомобиля есть разное количество КЛЮЧЕВЫХ СПЕЦИЙ, и я имею в виду следующее: если мы возьмем первый пример, который мы имеем: являются:

|2018 (18 reg)|Hatchback|8000 miles|1.4L|143bhp|Manual|Petrol|1 owner|Full service history|

На другом автомобиле, однако, КЛЮЧЕВЫЕ ХАРАКТЕРИСТИКИ могут быть:

|2013 (13 reg)|120000 miles|8 owners|

То, что я предполагаю, не является идеальным, поскольку не существует согласованного количества ключевых спец. * Переменные, в первом примере было 9 переменных, а во втором примере было только 3 переменные, и переменные также не совпадают, как для примеров. Таким образом, второй переменной для первого примера был «хэтчбек», а второй переменной для второго примера - «120000 миль», я предполагаю, что это проблема, поскольку 120000 миль несопоставимы с хэтчбеком (опять же, я не знаю, как ML модели работают, поэтому я не уверен, что это вообще проблема).

Теперь, когда я чувствую, что объяснил свою проблему как можно лучше, я расскажу вам несколько вещей, которые у меня есть. попробовал уже. Сначала я подумал, что могу использовать одну горячую кодировку для каждого из моих столбцов отдельно. Я начал с превращения первого столбца «ИМЯ АВТОМОБИЛЯ» в гигантский список списков c, где каждый список в общем списке содержал строку, которая обозначала название этого автомобиля. Например, если бы я сделал это с автомобилями в моем примере, я бы сгенерировал список, который выглядит следующим образом:

[['Abarth 1.4 595 3d 144 BHP'], ['Alfa Romeo 159 Sportwagon 1.9 JTDM 16v TI Estate 5dr Diesel …'], ['Alfa Romeo Giulia 2.0 TB 280 Veloce 4dr Auto'], ['Alfa Romeo Giulietta 1.4 MULTIAIR LUSSO TB 5d 170 BHP DNA …']]

Следующим шагом, который я сделал, было создание нового списка, который вместо того, чтобы содержать много списков Просто содержал каждое слово. Поэтому я бы сгенерировал список, который выглядел бы так:

['Abarth', '1.4', '595', '3d', '144', 'BHP', 'Alfa', 'Romeo', '159', 'Sportwagon', '1.9', 'JTDM', '16v', 'TI', 'Estate', '5dr', 'Diesel', '…', 'Alfa', 'Romeo', 'Giulia', '2.0', 'TB', '280', 'Veloce', '4dr', 'Auto', 'Alfa', 'Romeo', 'Giulietta' '1.4', 'MULTIAIR', 'LUSSO', 'TB', '5d', '170', 'BHP', 'DNA', '…']

Затем я взял только уникальные слова из этого списка, чтобы создать еще один новый список, и после этого я использовал word2int, чтобы назначить целочисленное значение каждому из слова из моего окончательного списка, которые не содержали повторяющихся слов. Затем я попытался использовать один горячий вектор для обучения модели, но мой компьютер завис и завис из-за рабочей нагрузки. Так что я даже не смог обучить первый столбец «ИМЯ ЗАБОТЫ», как я полагаю, из-за огромного размера словарного запаса и из-за неэффективности одного горячего вектора. Код, который я использовал, выглядит следующим образом:

Не стесняйтесь пропустить этот бит кода, так как это, вероятно, не то, что в любом случае

# function to convert numbers to one hot vectors
def to_one_hot(data_point_index, vocab_size):
    temp = np.zeros(vocab_size)
    temp[data_point_index] = 1
    return temp
x_train = [] # input word
y_train = [] # output word
for data_word in data:
    x_train.append(to_one_hot(word2int[ data_word[0] ], vocab_size))
    y_train.append(to_one_hot(word2int[ data_word[1] ], vocab_size))
# convert them to numpy arrays, Now we have our x_train and our y_train! yay!
x_train = np.asarray(x_train)
y_train = np.asarray(y_train)

print(x_train.shape, y_train.shape)   # (x_train.shape, y_train.shape) = (392978, 1698) (392978, 1698)
                                      # This means 39,2978 training points, where each point has 1,698 dimensions


x = tf.placeholder(tf.float32, shape=(None, vocab_size))
y_label = tf.placeholder(tf.float32, shape=(None, vocab_size))
EMBEDDING_DIM = 5 # you can choose your own number
W1 = tf.Variable(tf.random_normal([vocab_size, EMBEDDING_DIM]))
b1 = tf.Variable(tf.random_normal([EMBEDDING_DIM])) #bias
hidden_representation = tf.add(tf.matmul(x,W1), b1)
#Next, we take what we have in the embedded dimension and make a prediction about the neighbour. To make the prediction we use softmax.
W2 = tf.Variable(tf.random_normal([EMBEDDING_DIM, vocab_size]))
b2 = tf.Variable(tf.random_normal([vocab_size]))
prediction = tf.nn.softmax(tf.add( tf.matmul(hidden_representation, W2), b2))
# Now all that's left to do is train it
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init) #make sure you do this!
# define the loss function:
cross_entropy_loss = tf.reduce_mean(-tf.reduce_sum(y_label * tf.log(prediction), reduction_indices=[1]))
# define the training step:
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(cross_entropy_loss)
n_iters = 10000    #Suggested 10,000 iterations, takes forever!!!
# train for n_iter iterations
for _ in range(n_iters):
    sess.run(train_step, feed_dict={x: x_train, y_label: y_train})
    print('loss is : ', sess.run(cross_entropy_loss, feed_dict={x: x_train, y_label: y_train}))
print('----------')
print(sess.run(W1))
print('----------')
print(sess.run(b1))
print('----------')
vectors = sess.run(W1 + b1)
print(vectors[ word2int['sportback'] ])

Так что после попытки это и получить точно никуда я не пытался использовать плотные вложения слов вместо одного горячего вектора. Я не совсем уверен, что это был правильный вызов. Я бы хотел, чтобы кто-то пролил немного света на то, чего я пытаюсь достичь, и направил меня в правильном направлении. Извините за длинный пост, но я думаю, что было необходимо полностью объяснить себя.

Наконец, просто чтобы повторить то, что я на самом деле прошу, это помочь обучить модель, чтобы предсказать цену автомобиля, путем используя 200 000 (или около того) строк данных, которые у меня есть, имея в виду, что данные, которые у меня есть, перемешаны с некоторыми столбцами, имеющими текст, некоторые столбцы с числами, а некоторые - с текстом и числами.

Огромное спасибо, если вы добрались до конца этого поста, любая помощь, которую вы можете оказать мне, будет иметь большое значение go. Я надеюсь, что другие пользователи Stack Exchange также смогут воспользоваться этим вопросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...