Apa cara yang baik untuk mengubah atribut Ordinal Cyclic?

21

Saya memiliki bidang 'jam' sebagai atribut saya, tetapi dibutuhkan nilai siklik. Bagaimana saya bisa mengubah fitur untuk menjaga informasi seperti '23' dan '0' jam dekat tidak jauh.

Satu cara yang bisa saya pikirkan adalah melakukan transformasi: 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]

Apakah ada standar untuk menangani atribut seperti itu?

Update: Saya akan menggunakan superviseed learning, untuk melatih classifier hutan acak!

Mangat Rai Modi
sumber
1
Pertanyaan pertama yang bagus! Bisakah Anda menambahkan lebih banyak informasi tentang apa tujuan Anda untuk melakukan transformasi fitur spesifik ini? Apakah Anda bermaksud menggunakan fitur yang diubah ini sebagai masukan untuk masalah pembelajaran yang diawasi? Jika demikian, silakan pertimbangkan untuk menambahkan informasi itu karena dapat membantu orang lain menjawab pertanyaan ini dengan lebih baik.
Nitesh
1
@Nitesh, Silakan lihat pembaruan
Mangat Rai Modi
Anda dapat menemukan jawabannya di sini: datasetcience.stackexchange.com/questions/4967/…
MrMeritology
Maaf tapi saya tidak bisa berkomentar. @ AN6U5 dapatkah Anda memperpanjang cara mempertimbangkan hari dan minggu secara simultan mengikuti pendekatan luar biasa Anda? Saya berjuang dalam hal ini sejak seminggu dan saya juga memposting Q tetapi Anda tidak membacanya.
Seymour

Jawaban:

33

Cara paling logis untuk mengubah jam adalah menjadi dua variabel yang berayun bolak-balik. Bayangkan posisi ujung jarum jam dari 24 jam. The xayunan posisi bolak-balik dari wastafel dengan yposisi. Untuk jam 24-jam Anda dapat melakukannya dengan x=sin(2pi*hour/24), y=cos(2pi*hour/24).

Anda perlu kedua variabel atau gerakan yang tepat melalui waktu hilang. Hal ini disebabkan oleh fakta bahwa turunan dari dosa atau cos berubah dalam waktu ketika (x,y)posisi bervariasi dengan lancar saat bergerak di sekitar satuan lingkaran.

Akhirnya, pertimbangkan apakah perlu menambahkan fitur ketiga untuk melacak waktu linier, yang dapat dibangun jam saya (atau menit atau detik) dari awal catatan pertama atau cap waktu Unix atau sesuatu yang serupa. Ketiga fitur ini kemudian memberikan proksi untuk progresif siklus dan linear waktu, mis. Anda dapat menarik fenomena siklus seperti siklus tidur dalam pergerakan manusia dan juga pertumbuhan linear seperti populasi vs waktu.

Semoga ini membantu!

Menambahkan beberapa kode contoh yang relevan yang saya hasilkan untuk jawaban lain:

Contoh jika dilakukan:

# 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

masukkan deskripsi gambar di sini

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

Sekarang mari kita coba:

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

masukkan deskripsi gambar di sini

Anda hanya bisa melihat bahwa ada beberapa setelah tengah malam yang termasuk dalam kluster hijau sebelum tengah malam. Sekarang mari kita kurangi jumlah cluster dan tunjukkan bahwa sebelum dan sesudah tengah malam dapat dihubungkan dalam satu cluster secara lebih detail:

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

masukkan deskripsi gambar di sini

Lihat bagaimana gugus biru berisi waktu dari sebelum dan sesudah tengah malam yang dikelompokkan bersama di dalam kluster yang sama ...

QED!

AN6U5
sumber
Cara brilian untuk menanganinya. Ini akan memberikan skor yang sama 0 dan 23 jam tetapi tidakkah itu membuat waktu am / pm serupa juga? Yang sebenarnya dipisahkan oleh jendela 12 jam.
Mangat Rai Modi
Waktu 12 jam (AM / PM) tidak berfungsi, cukup konversikan ke waktu 24 jam.
AN6U5
Saya hanya memperhatikan bahwa Anda membaginya dengan 24. Ketika Anda memberikan analogi dengan jam, saya pikir itu adalah jam 12 jam standar. Namun Anda mengambil jam 24 jam. Tampaknya ini cara terbaik bagi saya untuk berubah. Terima kasih!
Mangat Rai Modi
Jawaban yang luar biasa Persis apa yang saya cari Terima kasih ..
Aditya
Jawaban yang diterima menggabungkan dosa () & biaya () bagus; di sini sebagai pelengkap penjelasan lain yang sangat terperinci dan bagus untuknya oleh Ian London.
FlorianH
3

Pertanyaannya sangat menarik dan saya tidak ingat membaca tentang jawaban yang menarik. Karena itu saya berani memberi Anda satu solusi yang mungkin bahkan jika itu terlihat cukup gila.

Biasanya seseorang menghindari memiliki informasi yang sama dalam banyak fitur, karena banyak algoritma tidak dapat mengatasinya. Tapi ini bukan kasus hutan acak. Membandingkan regresi linier (dan semua model berdasarkan ide yang sama), hutan acak menguji semua fitur, dengan mempertimbangkan setiap fitur satu per satu. Dengan cara ini dimungkinkan untuk membuat kode informasi yang sama dalam berbagai cara tanpa mempengaruhi kinerja pembelajaran, hanya ruang dan waktu berjalan.

(h+Haiffset) . Ini seperti ketika Anda menyandikan waktu di zona waktu lokal. Dengan demikian Anda memberikan kesempatan untuk mendeteksi menggunakan unit yang sama beberapa aglomerasi menarik sekitar beberapa jam, karena setiap jam yang mungkin memiliki kesempatan untuk dikodekan dengan benar dalam setidaknya 1 dari 24 fitur.

Itu menghabiskan beberapa ruang dan waktu, tetapi saya akan mencobanya untuk melihat bagaimana itu bekerja.

rapaio
sumber
0

Idealnya Anda tidak perlu transformasi apa pun. Perbedaan waktu relatif antara dua titik dapat digunakan sebagai fungsi jarak. Di mana klasifikasi dapat didasarkan pada ini.

di java:

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);
        }
    }
}
shiva.n404
sumber
1
Tidak apa-apa tetapi pertanyaannya membutuhkan sesuatu yang lain ..
Aditya