Döngüsel Sırasal özellikleri dönüştürmenin iyi bir yolu nedir?


21

Özelliğim olarak 'hour' alanını kullanıyorum, ancak döngüsel bir değer alıyor. '23' ve '0' saat gibi bilgileri korumak için bu özelliği nasıl dönüştürebilirim?

Düşünebilmemin bir yolu dönüşüm yapmak. min(h, 23-h)

Input: [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]

Output: [0 1 2 3 4 5 6 7 8 9 10 11 11 10 9 8 7 6 5 4 3 2 1]

Bu niteliklerle başa çıkmak için herhangi bir standart var mı?

Güncelleme: Ben rastgele orman sınıflandırıcı yetiştirmek için denetimli öğrenme kullanacağım!


1
Mükemmel ilk soru! Bu özel özellik dönüşümünü gerçekleştirme amacınız nedir hakkında daha fazla bilgi ekleyebilir misiniz? Bu dönüştürülmüş özelliği denetimli bir öğrenme sorununa girdi olarak kullanmak niyetinde misiniz? Öyleyse, lütfen bu bilgileri başkalarının bu soruyu daha iyi yanıtlamasına yardımcı olabileceği için eklemeyi düşünün.
Nitesh

1
@Nitesh, Lütfen güncellemeye bakın
Rai Modi


Üzgünüm ama yorum yapamam. @ AN6U5, inanılmaz bir yaklaşımı izleyerek haftanın gününü ve saatini nasıl simultane olarak değerlendireceğinizi lütfen uzatır mısınız? Bir haftadan beri bunun için mücadele ediyorum ve ayrıca bir Q da gönderdim ama siz okumadınız.
Seymour

Yanıtlar:


33

Saati dönüştürmenin en mantıklı yolu, lavabonun içinde ileri geri sallanan iki değişkendir. 24 saatlik bir saatin saat elinin sonunun konumunu hayal edin. xKonum hali ile ileri ve lavabo üzerinden geri ypozisyonda. 24 saatlik saat biçimi için size bu başarabilirsiniz x=sin(2pi*hour/24), y=cos(2pi*hour/24).

Her iki değişkene de ihtiyacınız var veya zaman içinde doğru hareket kaybedilir. Bunun nedeni ya günahın ya da cos'un türevinin, (x,y)pozisyonun birim çember etrafında hareket ederken yumuşak bir şekilde değiştiği zaman içerisinde değişmesidir.

Son olarak, ilk zamanın başlangıcından itibaren saat (veya dakika veya saniye) veya bir Unix zaman damgası veya benzeri bir şey oluşturulabilen lineer zamanı izlemek için üçüncü bir özellik eklemenin faydalı olup olmadığını düşünün. Bu üç özellik daha sonra zamanın hem döngüsel hem de doğrusal ilerlemesi için proxy'ler sağlar; örneğin, insanların hareketlerinde uyku döngüleri gibi döngüsel fenomenleri ve ayrıca zamana göre popülasyona benzer lineer büyümeyi çıkarabilirsiniz.

Bu yardımcı olur umarım!

Başka bir cevap için oluşturduğum ilgili bazı örnek kodları ekleyin:

Gerçekleştirilip gerçekleştirilmediği

# Enable inline plotting
%matplotlib inline

#Import everything I need...

import numpy as np
import matplotlib as mp

import matplotlib.pyplot as plt
import pandas as pd

# Grab some random times from here: https://www.random.org/clock-times/
# put them into a csv.
from pandas import DataFrame, read_csv
df = read_csv('/Users/angus/Machine_Learning/ipython_notebooks/times.csv',delimiter=':')
df['hourfloat']=df.hour+df.minute/60.0
df['x']=np.sin(2.*np.pi*df.hourfloat/24.)
df['y']=np.cos(2.*np.pi*df.hourfloat/24.)

df

görüntü tanımını buraya girin

def kmeansshow(k,X):

    from sklearn import cluster
    from matplotlib import pyplot
    import numpy as np

    kmeans = cluster.KMeans(n_clusters=k)
    kmeans.fit(X)

    labels = kmeans.labels_
    centroids = kmeans.cluster_centers_
    #print centroids

    for i in range(k):
        # select only data observations with cluster label == i
        ds = X[np.where(labels==i)]
        # plot the data observations
        pyplot.plot(ds[:,0],ds[:,1],'o')
        # plot the centroids
        lines = pyplot.plot(centroids[i,0],centroids[i,1],'kx')
        # make the centroid x's bigger
        pyplot.setp(lines,ms=15.0)
        pyplot.setp(lines,mew=2.0)
    pyplot.show()
    return centroids

Şimdi deneyelim:

kmeansshow(6,df[['x', 'y']].values)

görüntü tanımını buraya girin

Sadece gece yarısından önce yeşil kümenin dahil olduğu gece yarısından sonra olanların olduğunu ancak zar zor görebilirsiniz. Şimdi küme sayısını azaltalım ve gece yarısından önce ve sonra tek bir kümeye daha ayrıntılı bir şekilde bağlanabileceğini gösterelim:

kmeansshow(3,df[['x', 'y']].values)

görüntü tanımını buraya girin

Mavi kümenin gece yarısından önce ve sonra aynı kümede birlikte kümelenmiş zamanları nasıl içerdiğini görün ...

QED!


Başa çıkmanın mükemmel yolu. 0 ve 23 saat benzer puanlar verirdi ama öğleden sonra / öğleden sonraları benzer yapmaz mı? Bu aslında 12 saat pencereyle ayrılmıştır.
Mangat Rai Modi

12 saat (ÖS / ÖS) süresi çalışmaz, yalnızca 24 saat saatine dönüştürün.
AN6U5

Sadece 24'e böldüğünüzü fark ettim. Saate benzettiğinizde, standart bir 12 saatlik saat olduğunu düşündüm. Ancak 24 saat saat alıyorsunuz. Dönüşüm yapmam için en iyi yol bu gibi görünüyor. Teşekkür ederim!
Mangat Rai Modi

Şaşırtıcı cevap Tam olarak ne aradığımı teşekkürler ..
Aditya

Günah () ve maliyet () 'i birleştiren kabul edilen cevap harika; Burada bir tamamlayıcı olarak Ian London tarafından başka bir ayrıntılı ve hoş bir açıklama.
FlorianH

3

Soru çok ilginç ve ilginç cevaplar hakkında okumayı hatırlamıyorum. Bu nedenle, yeterince çılgınca görünse de size olası bir çözümü vermeye cesaret ederim.

Genellikle bir çok kişi aynı bilgiyi çoklu özelliklerde kullanmaktan kaçınır, çünkü birçok algoritma bununla başa çıkamaz. Ancak bu rastgele orman durumu değildir. Buna karşılık doğrusal regresyona (ve benzer fikirlere dayanan tüm modellere) zıt olan rastgele ormanlar, her bir özelliği tek tek dikkate alarak tüm özellikleri test eder. Bu yolla, aynı bilgiyi öğrenme performansını, sadece alan ve çalışma süresini etkilemeden birçok yolla kodlamak mümkündür.

(h+Offset)

Biraz yer ve zaman harcıyor, ama nasıl çalıştığını görmeye çalışırım.


0

İdeal olarak herhangi bir dönüşüme ihtiyacınız yoktur. İki nokta arasındaki bağıl zaman farkı mesafe fonksiyonu olarak kullanılabilir. Sınıflandırmanın buna dayanabileceği yer.

java'da:

public class TimeDistanceMeasurer implements DistanceMeasure {

    @Override
    public double compute(double[] a, double[] b) throws DimensionMismatchException {
        String time1 = String.format("%02d", (int)a[0]) + String.format("%02d", (int)a[0]);
        String time2 = String.format("%02d", (int)b[0]) + String.format("%02d", (int)b[0]);

        SimpleDateFormat format = new SimpleDateFormat("HHmm");
        try {
            Date date1 = format.parse(time1);
            Date date2 = format.parse(time2);
            return Math.abs(date2.getTime() - date1.getTime());
        } catch (Exception e) {
            throw new IllegalStateException("Something went wrong.", e);
        }
    }
}

1
Sorun değil, ancak sorunun başka bir şeye ihtiyacı var ..
Aditya
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.