Статьи

Поиск пикселей без отклонений с помощью R

Ранее я  писал  о наших попытках решить  проблему  с  Kaggle Digit Recogniser, и наш подход до сих пор заключался в том, чтобы использовать предоставленные данные и подключить их к различным алгоритмам и посмотреть, чем мы закончим.   

От  просмотра через форумы  мы увидели другое упоминание выделения признаков — подход , в котором мы преобразовать данные в другой формат, мышление в том , что мы можем обучить более классификатор с лучшими данными.

Была довольно хорошая цитата из поста, написанного Рэйчел Шутт о курсе Columbia Data Science, который  резюмировал допущенную нами ошибку :

Пространство между набором данных и алгоритмом

Многие люди переходят прямо от набора данных к применению алгоритма. Но между важными вещами есть огромное пространство. Легко запустить фрагмент кода, который предсказывает или классифицирует. Это не самая сложная часть. Трудная часть делает это хорошо.

Одна вещь, которую мы заметили при визуальном сканировании набора данных, заключалась в том, что многие функции, по-видимому, постоянно имеют значение 0. Мы подумали, что попытаемся выяснить, какие это пиксели, найдя объекты с нулевой дисперсией в их ценности.

Я начал с загрузки подмножества набора данных, а затем взял образец этого, чтобы поиграть с:

initial <- read.csv("train.csv", nrows=10000, header = TRUE)
 
# take a sample of 1000 rows of the input 
sampleSet <- initial[sample(1:nrow(initial), 1000), ]

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

# get all the labels
sampleSet.labels <- as.factor(sampleSet$label)
 
> table(sampleSet.labels)
sampleSet.labels
0 1 2 3 4 5 6 7 8 9 
102 116 100 97 95 91 79 122 102 96

Есть несколько больше 1 и 7, чем у других лейблов, но они примерно в одном поле, так что все в порядке.

Я хотел  исключить поле «метка»  из набора данных, потому что дисперсия меток нам не интересна в этом случае. Мы можем сделать это с помощью следующего кода:

# get data set excluding label
excludingLabel <- subset( sampleSet, select = -label)

Чтобы найти все функции без отклонений, мы делаем это:

# show all the features which don't have any variance - all have the same value
variances <- apply(excludingLabel, 2, var)
 
# get the names of the labels which have no variance
> pointlessFeatures <- names(excludingLabel[variances == 0][1,])
 
[1] "pixel0" "pixel1" "pixel2" "pixel3" "pixel4" "pixel5" "pixel6" "pixel7" 
[9] "pixel8" "pixel9" "pixel10" "pixel11" "pixel12" "pixel13" "pixel14" "pixel15" 
[17] "pixel16" "pixel17" "pixel18" "pixel19" "pixel20" "pixel21" "pixel22" "pixel23"
[25] "pixel24" "pixel25" "pixel26" "pixel27" "pixel28" "pixel29" "pixel30" "pixel31"
[33] "pixel32" "pixel33" "pixel51" "pixel52" "pixel53" "pixel54" "pixel55" "pixel56"
[41] "pixel57" "pixel58" "pixel59" "pixel60" "pixel82" "pixel83" "pixel84" "pixel85"
[49] "pixel86" "pixel88" "pixel110" "pixel111" "pixel112" "pixel113" "pixel114" "pixel139"
[57] "pixel140" "pixel141" "pixel142" "pixel168" "pixel169" "pixel196" "pixel252" "pixel280"
[65] "pixel308" "pixel335" "pixel336" "pixel364" "pixel365" "pixel392" "pixel393" "pixel420"
[73] "pixel421" "pixel448" "pixel476" "pixel504" "pixel532" "pixel559" "pixel560" "pixel587"
[81] "pixel615" "pixel643" "pixel644" "pixel645" "pixel671" "pixel672" "pixel673" "pixel699"
[89] "pixel700" "pixel701" "pixel727" "pixel728" "pixel729" "pixel730" "pixel731" "pixel752"
[97] "pixel753" "pixel754" "pixel755" "pixel756" "pixel757" "pixel758" "pixel759" "pixel760"
[105] "pixel779" "pixel780" "pixel781" "pixel782" "pixel783"

Мы можем подсчитать количество меток с помощью   функции длины :

# count how many labels have no variance
> length(names(excludingLabel[1,]))
[1] 109

Затем я записал их в файл, чтобы мы могли использовать их в качестве входных данных для кода, который создает наш классификатор.

write(file="pointless-features.txt", pointlessFeatures)

Конечно, мы должны выполнить дисперсионный тест для всего набора данных, а не только для выборки, и для всего набора данных есть только 76 объектов с нулевой дисперсией:

> sampleSet <- read.csv("train.csv", header = TRUE)
> sampleSet.labels <- as.factor(sampleSet$label)
> table(sampleSet.labels)
sampleSet.labels
0 1 2 3 4 5 6 7 8 9 
4132 4684 4177 4351 4072 3795 4137 4401 4063 4188 
> excludingLabel <- subset( sampleSet, select = -label)
> variances <- apply(excludingLabel, 2, var)
> pointlessFeatures <- names(excludingLabel[variances == 0][1,])
> length(names(excludingLabel[apply(excludingLabel, 2, var) == 0][1,]))
[1] 76

Мы создали деревья решений, используя этот сокращенный набор данных, но еще не отправили лес в Kaggle, чтобы проверить, точнее ли он!

Я взял небольшую информацию о RI из [a href = «https://class.coursera.org/compdata-002/class/index» style = «color: rgb (0, 68, 119);»] Курс анализа данных, который начался на прошлой неделе и из книги « R in a Nutshell », которую  рекомендовал мой коллега  Пол Лэм .