เป็นวิธีที่ดีในการแปลงแอตทริบิวต์ลำดับรอบเป็นอย่างไร


21

ฉันมีฟิลด์ 'ชั่วโมง' เป็นคุณลักษณะของฉัน แต่มันต้องใช้ค่าวงจร ฉันจะแปลงคุณสมบัติเพื่อรักษาข้อมูลเช่น '23' และ '0' ชั่วโมงได้อย่างไร

วิธีหนึ่งที่ฉันสามารถคิดได้คือทำการเปลี่ยนแปลง: 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]

มีมาตรฐานในการจัดการคุณลักษณะดังกล่าวหรือไม่?

อัปเดต: ฉันจะใช้การเรียนรู้แบบกำกับเพื่อฝึกฝนลักษณนามป่าสุ่ม!


1
คำถามแรกที่ยอดเยี่ยม! คุณสามารถเพิ่มข้อมูลเพิ่มเติมเกี่ยวกับเป้าหมายของคุณในการดำเนินการแปลงคุณสมบัตินี้ได้อย่างไร คุณตั้งใจจะใช้คุณสมบัติที่แปลงโฉมนี้เป็นปัจจัยในการแก้ไขปัญหาการเรียนรู้แบบมีผู้สอนหรือไม่ ถ้าเป็นเช่นนั้นโปรดพิจารณาเพิ่มข้อมูลนั้นเนื่องจากอาจช่วยให้ผู้อื่นตอบคำถามนี้ได้ดีขึ้น
Nitesh

1
@Nitesh โปรดดูการอัปเดต
Mangat Rai Modi

คุณสามารถหาคำตอบได้ที่นี่: datascience.stackexchange.com/questions/4967/…
MrMeritology

ขออภัยฉันไม่สามารถแสดงความคิดเห็น @ AN6U5 คุณช่วยกรุณาขยายวิธีพิจารณาวันและสัปดาห์ตามแบบอย่างที่น่าอัศจรรย์ได้อย่างไร ฉันกำลังดิ้นรนกับเรื่องนี้มาเป็นเวลาหนึ่งสัปดาห์และฉันยังโพสต์คำถาม แต่คุณไม่ได้อ่าน
มัวร์

คำตอบ:


33

วิธีที่สมเหตุสมผลที่สุดในการแปลงชั่วโมงเป็นสองตัวแปรที่แกว่งไปมาจากอ่างล้างจาน ลองนึกภาพตำแหน่งของจุดสิ้นสุดของเข็มชั่วโมงของนาฬิกา 24 ชั่วโมง xชิงช้าตำแหน่งกลับออกมาจากอ่างล้างจานกับyตำแหน่ง สำหรับนาฬิกา 24 ชั่วโมงคุณสามารถบรรลุนี้ด้วยx=sin(2pi*hour/24),y=cos(2pi*hour/24) .

คุณต้องการตัวแปรทั้งสองหรือการเคลื่อนไหวที่เหมาะสมผ่านเวลาจะหายไป นี่เป็นเพราะความจริงที่ว่าอนุพันธ์ของบาปหรือการเปลี่ยนแปลง cos ในเวลาที่เป็น(x,y)ตำแหน่งที่แตกต่างกันอย่างราบรื่นในขณะที่มันเดินทางไปรอบ ๆ หน่วยยูนิท

สุดท้ายพิจารณาว่ามันคุ้มค่าหรือไม่ที่จะเพิ่มฟีเจอร์ที่สามเพื่อติดตามเวลาเชิงเส้นซึ่งสามารถสร้างชั่วโมงของฉัน (หรือนาทีหรือวินาที) จากจุดเริ่มต้นของการบันทึกครั้งแรกหรือการประทับเวลา Unix หรือบางอย่างที่คล้ายกัน คุณสมบัติทั้งสามนี้จะให้พร็อกซีสำหรับทั้งความก้าวหน้าและเชิงเส้นของเวลาเช่นคุณสามารถดึงปรากฏการณ์วัฏจักรเช่นวงจรการนอนหลับในการเคลื่อนไหวของผู้คนและการเติบโตเชิงเส้นเช่นประชากรเทียบกับเวลา

หวังว่านี่จะช่วยได้!

การเพิ่มโค้ดตัวอย่างที่เกี่ยวข้องซึ่งฉันสร้างขึ้นสำหรับคำตอบอื่น:

ตัวอย่างของการสำเร็จ:

# 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

ป้อนคำอธิบายรูปภาพที่นี่

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

ตอนนี้ให้ลอง:

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

ป้อนคำอธิบายรูปภาพที่นี่

คุณเพิ่งจะเห็นว่ามีบางส่วนหลังเที่ยงคืนรวมอยู่ในคลัสเตอร์สีเขียวก่อนเที่ยงคืน ตอนนี้ให้ลดจำนวนกลุ่มและแสดงว่าสามารถเชื่อมต่อก่อนและหลังเที่ยงคืนในคลัสเตอร์เดียวโดยมีรายละเอียดเพิ่มเติม:

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

ป้อนคำอธิบายรูปภาพที่นี่

ดูว่าคลัสเตอร์สีน้ำเงินประกอบด้วยเวลาที่มาจากก่อนและหลังเที่ยงคืนที่รวมเข้าด้วยกันในคลัสเตอร์เดียวกัน ...

QED!


วิธีที่ยอดเยี่ยมในการจัดการมัน มันจะให้คะแนน 0 และ 23 ชั่วโมงที่คล้ายกัน แต่จะไม่ทำให้เวลา am / pm เหมือนกันหรือไม่ ซึ่งอันที่จริงแล้วคั่นด้วยหน้าต่าง 12 ชม.
Mangat Rai Modi

เวลา 12 ชั่วโมง (AM / PM) ไม่ทำงานเพียงแปลงเป็น 24 ชั่วโมง
AN6U5

ฉันเพิ่งสังเกตว่าคุณหารด้วย 24. เมื่อคุณเปรียบเทียบกับนาฬิกาฉันคิดว่ามันเป็นนาฬิกามาตรฐาน 12 ชั่วโมง อย่างไรก็ตามคุณใช้เวลาตลอด 24 ชั่วโมง ดูเหมือนจะเป็นวิธีที่ดีที่สุดสำหรับฉันในการเปลี่ยนแปลง ขอขอบคุณ!
Mangat Rai Modi

คำตอบที่น่าอัศจรรย์อย่างแน่นอนสิ่งที่ฉันกำลังมองหาขอบคุณ ..
Aditya

คำตอบที่ยอมรับได้รวมบาป () & cost () นั้นยอดเยี่ยม นี่เป็นส่วนเสริมอีกคำอธิบายที่ละเอียดและดีมากสำหรับเอียนลอนดอน
FlorianH

3

คำถามน่าสนใจมากและฉันจำไม่ได้ว่าต้องอ่านคำตอบที่น่าสนใจ เพราะฉันกล้าที่จะให้ทางออกที่เป็นไปได้แก่คุณแม้ว่ามันจะดูบ้าพอก็ตาม

โดยทั่วไปแล้วจะหลีกเลี่ยงการมีข้อมูลเดียวกันในหลาย ๆ คุณสมบัติเนื่องจากอัลกอริธึมจำนวนมากไม่สามารถจัดการได้ แต่นี่ไม่ใช่กรณีของฟอเรสต์แบบสุ่ม การถดถอยเชิงเส้นตรงข้าม (และทุกรุ่นขึ้นอยู่กับแนวคิดที่คล้ายกัน) ฟอเรสต์แบบสุ่มจะทดสอบคุณลักษณะทั้งหมดโดยคำนึงถึงแต่ละคุณลักษณะทีละรายการ วิธีนี้เป็นไปได้ที่จะเขียนโค้ดข้อมูลเดียวกันในหลาย ๆ วิธีโดยไม่ส่งผลกระทบต่อประสิทธิภาพการเรียนรู้พื้นที่ว่างเปล่าและเวลาทำงาน

(ชั่วโมง+โอsอีเสื้อ) )มันเหมือนเมื่อคุณเข้ารหัสเวลาในโซนเวลาท้องถิ่น ดังนั้นคุณจึงให้โอกาส rf ในการตรวจจับโดยใช้หน่วยเดียวกันบาง agglomerations ที่น่าสนใจรอบบางชั่วโมงเพราะแต่ละชั่วโมงที่เป็นไปได้มีโอกาสที่จะเข้ารหัสอย่างถูกต้องในคุณสมบัติอย่างน้อย 1 จาก 24

มันเสียพื้นที่และเวลา แต่ฉันอยากลองดูวิธีการทำงาน


0

เป็นการดีที่คุณไม่ต้องการการเปลี่ยนแปลงใด ๆ ความแตกต่างของเวลาญาติระหว่างสองจุดสามารถใช้เป็นฟังก์ชั่นระยะทาง โดยที่การจำแนกประเภทจะขึ้นอยู่กับสิ่งนี้

ใน 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);
        }
    }
}

1
ไม่เป็นไร แต่คำถามนั้นต้องการอย่างอื่น ..
Aditya
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.