DBScan Mejorar peso features

Airbus_emitter
Airbus_emitter New Altair Community Member
edited November 5 in Community Q&A
Buenos días, 

Soy nuevo por aqui y tambien en rapid miner. Estoy intentando realizar un clusterizado usando dbscan. Actalmente consigo el clusterizado que quiero dando un mayor o menos peso manualmente a mis features. Pero me gustaría conocer algun operador que haga esta funcion automáticamente. Esto, es, que en funcion de los datos introducids se autoajuste el peso que deben tomar cada una de las features.

Muestro el pequeño proceso que tengo montado ahora mismo.


En este caso trato señales de un emisor.
Tengo 6 parámetros. RF_min, RF_max, pRI_max, pRI_min, PW_max, PW_min. Seria modificar el tipo de clusterizado que hace en función de los dispersos que estan los datos introducidos. Con esto em refiero por ejemplo, si hya valores con RF min en torno a 1000 y otros con 8000, el peso de RF se debe ver reducido. Sin embargo, si todos los valores están entre 5000 y 6000, pues que le dé mas peso, para que el clusterizado sea más idóneo.
Cuando hablo de pesos, hablo de modificar el siguiente operador generateAttributes.



En cuanto a los valores de dbscan, he probado a tocar el min points o el epsilon, pero no me gusta el clusterizado que hace. Por lo tanto ahora mismo esos dos valores los tengo fijados en, epsilon 0.2 y min points 1

Pongo un ejemplo de lo que sucede. En este caso, PW por ejemplo no deberia tener variaciones y debería tomar 6.84 y 7 en el mismo cluster y no separarlo. Pero esto sucede porque RF debería "tener menos peso" (dividir entre un número mayor), para disgregarlo menos y tener menos clusters.


Y bien realizado sería mover el peso de RF a menos. Esto lo hago dividiendo entre 1000 y volviendo a correr el programa. Con esto consigo que todos los clusters se encuentren con Rf entre 9464 y 9871, sin realizar clusters nuevos entre estos dos valores.
Asi bien, diviendo RF entre 1000 tengo:

Answers

  • Marco_Barradas
    Marco_Barradas
    Altair Employee
    Hola @Airbus_emitter viendo el problema que describes de me ocurren algunos operadores que podrías utilizar.

    • Branch: Si tienes una toma de decisión binaria te podría ayudar para poder elegir el camino A o el B dependiendo de las condición que pongas
    • Select Subprocess: Si tienes más de un camino esto funciona como un switch o case y con una macro puedes decidir el camino a seguir
    • Optimize Parameters en conjunto con un Cluster count, distance o density distribution te podría ayudar a encontrar los parámetros óptimos para tu DBSCAN y así mejorar los resultados que buscas. aquí un video que te ayudará a conocer el concepto (https://academy.rapidminer.com/learn/video/optimization-of-the-model-parameters
    Saludos y espero que sea útil la información para avanzar en tu proyecto.

  • Airbus_emitter
    Airbus_emitter New Altair Community Member
    Gracias por la respuesta @MarcoBarradas
    En mi caso serían varias subprocesos y el uso de una macro. Estoy intentando hacerlo, pero no consigo que corra el programa, seguramente por no saber usar estos operadores.

    La macro hecha con "generate macro" entiendo que sustituye al operador "select Subprocess".
    Dentro del subprocess no entiendo que debería meter y la macro como elige un subproceso u otro.
    El problema se reduce a lo siguiente

    Tengo un parámetro que pongamos que toma valores de 0 a 1000
    de 0 a 250 quiero que el "generate attributes", que es el que me normaliza, tome unos valores, de 250 a 500 otros, de 500 a 750 otro y de 750 a 1000 otro.
    Y despues de todo esto, me haga clusterizado dbscan con la opcion que se haya dado.


    Como sería esta macro o que debo meter en el subproceso? Que input debe tomar el subproceso?

  • Marco_Barradas
    Marco_Barradas
    Altair Employee
    @Airbus_emitter me surge una duda al ver tu proceso.
    Como regla general es recomendable realizar una normalización Z de los datos antes de realizar un clustering para evitar el efecto negativo de tener atributos en distintas escalas. 
    Para hacer eso utilizamos el operador Normalize y después se correría el DBSCAN

    Como puedes ver en el ejemplo que comparto el normalizar o no una BD tiene efecto en el resultado del cluster ya que los clusters son sensibles a los valores extremos.
    <?xml version="1.0" encoding="UTF-8"?><process version="9.8.001">
      <context>
        <input/>
        <output/>
        <macros/>
      </context>
      <operator activated="true" class="process" compatibility="6.0.002" expanded="true" name="Process" origin="GENERATED_TUTORIAL">
        <parameter key="logverbosity" value="init"/>
        <parameter key="random_seed" value="2001"/>
        <parameter key="send_mail" value="never"/>
        <parameter key="notification_email" value=""/>
        <parameter key="process_duration_for_mail" value="30"/>
        <parameter key="encoding" value="SYSTEM"/>
        <process expanded="true">
          <operator activated="true" class="generate_data" compatibility="9.8.001" expanded="true" height="68" name="Generate Data" width="90" x="45" y="85">
            <parameter key="target_function" value="gaussian mixture clusters"/>
            <parameter key="number_examples" value="1000"/>
            <parameter key="number_of_attributes" value="3"/>
            <parameter key="attributes_lower_bound" value="0.0"/>
            <parameter key="attributes_upper_bound" value="10000.0"/>
            <parameter key="gaussian_standard_deviation" value="10.0"/>
            <parameter key="largest_radius" value="10.0"/>
            <parameter key="use_local_random_seed" value="true"/>
            <parameter key="local_random_seed" value="1992"/>
            <parameter key="datamanagement" value="double_array"/>
            <parameter key="data_management" value="auto"/>
          </operator>
          <operator activated="true" class="normalize" compatibility="9.8.001" expanded="true" height="103" name="Normalize" width="90" x="179" y="85">
            <parameter key="return_preprocessing_model" value="false"/>
            <parameter key="create_view" value="false"/>
            <parameter key="attribute_filter_type" value="all"/>
            <parameter key="attribute" value=""/>
            <parameter key="attributes" value=""/>
            <parameter key="use_except_expression" value="false"/>
            <parameter key="value_type" value="numeric"/>
            <parameter key="use_value_type_exception" value="false"/>
            <parameter key="except_value_type" value="real"/>
            <parameter key="block_type" value="value_series"/>
            <parameter key="use_block_type_exception" value="false"/>
            <parameter key="except_block_type" value="value_series_end"/>
            <parameter key="invert_selection" value="false"/>
            <parameter key="include_special_attributes" value="false"/>
            <parameter key="method" value="Z-transformation"/>
            <parameter key="min" value="0.0"/>
            <parameter key="max" value="1.0"/>
            <parameter key="allow_negative_values" value="false"/>
          </operator>
          <operator activated="true" class="dbscan" compatibility="9.8.001" expanded="true" height="82" name="Clustering (2)" width="90" x="380" y="136">
            <parameter key="epsilon" value="1.0"/>
            <parameter key="min_points" value="5"/>
            <parameter key="add_cluster_attribute" value="true"/>
            <parameter key="add_as_label" value="false"/>
            <parameter key="remove_unlabeled" value="false"/>
            <parameter key="measure_types" value="MixedMeasures"/>
            <parameter key="mixed_measure" value="MixedEuclideanDistance"/>
            <parameter key="nominal_measure" value="NominalDistance"/>
            <parameter key="numerical_measure" value="EuclideanDistance"/>
            <parameter key="divergence" value="GeneralizedIDivergence"/>
            <parameter key="kernel_type" value="radial"/>
            <parameter key="kernel_gamma" value="1.0"/>
            <parameter key="kernel_sigma1" value="1.0"/>
            <parameter key="kernel_sigma2" value="0.0"/>
            <parameter key="kernel_sigma3" value="2.0"/>
            <parameter key="kernel_degree" value="3.0"/>
            <parameter key="kernel_shift" value="1.0"/>
            <parameter key="kernel_a" value="1.0"/>
            <parameter key="kernel_b" value="0.0"/>
          </operator>
          <operator activated="true" class="dbscan" compatibility="9.8.001" expanded="true" height="82" name="Clustering" width="90" x="380" y="34">
            <parameter key="epsilon" value="1.0"/>
            <parameter key="min_points" value="5"/>
            <parameter key="add_cluster_attribute" value="true"/>
            <parameter key="add_as_label" value="false"/>
            <parameter key="remove_unlabeled" value="false"/>
            <parameter key="measure_types" value="MixedMeasures"/>
            <parameter key="mixed_measure" value="MixedEuclideanDistance"/>
            <parameter key="nominal_measure" value="NominalDistance"/>
            <parameter key="numerical_measure" value="EuclideanDistance"/>
            <parameter key="divergence" value="GeneralizedIDivergence"/>
            <parameter key="kernel_type" value="radial"/>
            <parameter key="kernel_gamma" value="1.0"/>
            <parameter key="kernel_sigma1" value="1.0"/>
            <parameter key="kernel_sigma2" value="0.0"/>
            <parameter key="kernel_sigma3" value="2.0"/>
            <parameter key="kernel_degree" value="3.0"/>
            <parameter key="kernel_shift" value="1.0"/>
            <parameter key="kernel_a" value="1.0"/>
            <parameter key="kernel_b" value="0.0"/>
          </operator>
          <connect from_op="Generate Data" from_port="output" to_op="Normalize" to_port="example set input"/>
          <connect from_op="Normalize" from_port="example set output" to_op="Clustering" to_port="example set"/>
          <connect from_op="Normalize" from_port="original" to_op="Clustering (2)" to_port="example set"/>
          <connect from_op="Clustering (2)" from_port="cluster model" to_port="result 2"/>
          <connect from_op="Clustering" from_port="cluster model" to_port="result 1"/>
          <portSpacing port="source_input 1" spacing="0"/>
          <portSpacing port="sink_result 1" spacing="90"/>
          <portSpacing port="sink_result 2" spacing="18"/>
          <portSpacing port="sink_result 3" spacing="0"/>
        </process>
      </operator>
    </process>
    

    El operador Select Subproces espera una macro con un valor numérico (Select Which)  

    en lugar del 1 pondrías una macro %{opcion}

    la macro opción la crearías algún if que te arroje un número entre 1 y número de caminos posibles en tu ajuste de peso.
    Dentro del Subprocess harías lo que mencionamos en el mensaje anterior.

    Espero esto te ayude.