æåã§è¡ãããšãã§ããŸããããã®ããã»ã¹ãããéãç°¡åã«ããããã®ãã¬ãŒã ã¯ãŒã¯ãšã©ã€ãã©ãªããããŸããä»æ¥ã¯
ããã®ãã¡ã®1ã€ã§ããfeaturetoolsãšãããã䜿çšããå®éã®çµéšã«ã€ããŠèª¬æããŸãã
æããã¡ãã·ã§ããã«ãªãã€ãã©ã€ã³
ããã«ã¡ã¯ïŒç§ã¯ã¢ã¬ã¯ãµã³ããŒã»ãã¹ã¯ããã§ãããªãã€ã»ããŒãªã³ã§ããŒã¿ã¢ããªã¹ããšããŠåããŠããŸããä»ã§ã¯æµè¡ãã®ããŒã¿ç§åŠè ãšããŠåããŠããŸããç§ã®è²¬ä»»ã«ã¯ãããŒã¿ã®æäœãåæã¯ãšãªãšã¢ã³ããŒãããå§ãŸããã¢ãã«ã®ãã¬ãŒãã³ã°ããµãŒãã¹ãªã©ã§ã®ã¢ãã«ã®ã©ãããã³ãŒãã®é ä¿¡ãšå±éã®èšå®ãããã³ãã®äœæ¥ã®ç£èŠãå«ãŸããŸãã
å ã«æ»ãäºæž¬ã¯ãç§ãåãçµãã§ãã補åã®1ã€ã§ãã
補åã®ç®çïŒé¡§å®¢ããªã³ã©ã€ã³æ³šæããã£ã³ã»ã«ããå¯èœæ§ãäºæž¬ããŸãããã®ãããªäºæž¬ã®å©ããåããŠã泚æãè¡ã£ã顧客ã®ã©ããæåã«åŒã³åºããŠæ³šæã®ç¢ºèªãæ±ããã¹ããããããŠèª°ããŸã£ããåŒã³åºãããªãããå€æã§ããŸãã第äžã«ãé»è©±ã§ã¯ã©ã€ã¢ã³ãããã®æ³šæãé»è©±ã§ç¢ºèªãããšããäºå®èªäœããã£ã³ã»ã«ã®å¯èœæ§ãæžãããŸãã第äºã«ãé»è©±ããããŠçžæãæåŠããå ŽåããªãœãŒã¹ãç¯çŽã§ããŸãã泚æã®åéã«è²»ãããã§ãããåŸæ¥å¡ã®ããã«ããå€ãã®æéã解æŸãããŸããããã«ããã®æ¹æ³ã§è£œåã¯æ£ã«æ®ãããã®æç¹ã§åºã®é¡§å®¢ããããå¿ èŠãšããå Žåã圌ã¯ãããè³Œå ¥ããããšãã§ããŸãããããŠããã«ãããåŸã§ãã£ã³ã»ã«ããã泚æã§åéãããæ£ã«ãªãã£ãååã®æ°ãæžããŸãã
å é§è
補åãã€ãããã«ã€ããŠã¯ãè€æ°ã®åºèã§ã®éè·ã®ããã«åŸæã泚æã®ã¿ãåãä»ããŸãã
æ¢è£œã®ãœãªã¥ãŒã·ã§ã³ã¯æ¬¡ã®ããã«æ©èœããŸããApacheNiFiã䜿çšããŠæ³šæãå±ããååã«é¢ããããŒã¿ãååŸãããªã©ãæ å ±ãå å®ãããŸãã次ã«ãããããã¹ãŠãApacheKafkaã¡ãã»ãŒãžãããŒã«ãŒãä»ããŠPythonã§èšè¿°ããããµãŒãã¹ã«è»¢éãããŸãããµãŒãã¹ã¯æ³šæã®ç¹åŸŽãèšç®ãã次ã«ãããã®æ©æ¢°åŠç¿ã¢ãã«ãæ¡çšããããã£ã³ã»ã«ã®ç¢ºçã瀺ãããŸãããã®åŸãããžãã¹ããžãã¯ã«åŸã£ãŠãä»ããã¯ã©ã€ã¢ã³ãã«é»è©±ããå¿ èŠããããã©ããã®åçãæºåããŸãïŒããšãã°ãåºå ã®åŸæ¥å¡ã®å©ããåããŠæ³šæããå ŽåããŸãã¯å€ã«æ³šæããå Žåã¯ãé»è©±ããªãã§ãã ããïŒã
äœãé£ç¶ããŠå šå¡ã«é»è©±ããããã®ã劚ããã®ã§ããããïŒäºå®ãé»è©±ããããããã®ãªãœãŒã¹ã®æ°ã¯éãããŠããããã誰ã確å®ã«é»è©±ããããã¹ããã誰ãé»è©±ãªãã§ç¢ºå®ã«æ³šæãåãåãããç解ããããšãéèŠã§ãã
ã¢ãã«éçº
ç§ã¯ãµãŒãã¹ãã¢ãã«ãããã«å¿ããŠã¢ãã«ã®ç¹åŸŽã®èšç®ã«åŸäºããŸãããããã«ã€ããŠã¯åŸã§èª¬æããŸãã
ãã¬ãŒãã³ã°äžã«ç¹åŸŽãèšç®ãããšãã¯ã3ã€ã®ããŒã¿ãœãŒã¹ã䜿çšããŸãã
- 泚æã¡ã¿æ å ±ïŒæ³šæçªå·ãã¿ã€ã ã¹ã¿ã³ãã顧客ã®ããã€ã¹ãé éæ¹æ³ãæ¯æãæ¹æ³ïŒãèšèŒããããã¬ãŒãã
- ã¬ã·ãŒãã®äœçœ®ãèšèŒããããã¬ãŒãïŒæ³šæçªå·ãååãäŸ¡æ Œãæ°éãåšåº«åã®æ°éãåããžã·ã§ã³ã¯å¥ã ã®è¡ã«ãããŸãã
- è¡š-ååã®ãªãã¡ã¬ã³ã¹ããã¯ïŒèšäºãååã®ã«ããŽãªã枬å®åäœã説æãå«ãããã€ãã®ãã£ãŒã«ãã
æšæºã®Pythonã¡ãœãããšpandasã©ã€ãã©ãªã䜿çšãããšããã¹ãŠã®ããŒãã«ã1ã€ã®å€§ããªããŒãã«ã«ç°¡åã«çµã¿åãããããšãã§ããŸãããã®åŸãgroupbyã䜿çšããŠãé åºå¥ã®éèšã補åå¥ã®å±¥æŽã補åã«ããŽãªå¥ãªã©ãããããçš®é¡ã®æ©èœãèšç®ã§ããŸãããã ããããã§ããã€ãã®åé¡ãçºçããŸãã
- èšç®ã®äžŠååŠçãæšæºã®groupbyã¯1ã€ã®ã¹ã¬ããã§æ©èœããããã°ããŒã¿ïŒæ倧1,000äžè¡ïŒã§ã¯ãæ®ãã®ã³ã¢ã®å®¹éãã¢ã€ãã«ç¶æ ã§ããéã100ã®æ©èœã蚱容ã§ããªãã»ã©é·ããšèŠãªãããŸãã
- ã³ãŒãã®éïŒãã®ãããªåãªã¯ãšã¹ãã¯åå¥ã«èšè¿°ããæ£ç¢ºæ§ããã§ãã¯ããå¿ èŠããããŸãããã®åŸããã¹ãŠã®çµæãåéããå¿ èŠããããŸããããã«ã¯æéãããããŸããç¹ã«ãã¬ã·ãŒãå ã®ã¢ã€ãã ã®ææ°ã®å±¥æŽãèšç®ãã泚æã®ãããã®ç¹æ§ãéèšãããªã©ãäžéšã®èšç®ãè€éã§ããããšãèãããšãããã«ã¯æéãããããŸãã
- ãã¹ãŠãæäœæ¥ã§ã³ãŒãã£ã³ã°ãããšãééããç¯ãå¯èœæ§ããããŸãã
ãç§ãã¡ã¯ãã¹ãŠãæã§æžããã¢ãããŒãã®å©ç¹ã¯ããã¡ãããè¡åã®å®å šãªèªç±ã§ãããããªãã¯ããªãã®æ³ååãå±éããããšãã§ããŸãã
çåãçããŸãïŒäœæ¥ã®ãã®éšåãã©ã®ããã«æé©åã§ãããã1ã€ã®è§£æ±ºçã¯ãfeaturetoolsã©ã€ãã©ãªã䜿çšããããšã§ãã
ããã§ã¯ããã®èšäºã®æ¬è³ªãã€ãŸãã©ã€ãã©ãªèªäœãšãã®äœ¿çšæ¹æ³ã«ãã§ã«é²ãã§ããŸãã
ãªãfeaturetoolsïŒ
ãã¬ãŒãã®åœ¢ã§æ©æ¢°åŠç¿ã®ããŸããŸãªãã¬ãŒã ã¯ãŒã¯ãèããŠã¿ãŸãããïŒåçèªäœã¯ããããæ£çŽã«çãŸããŠããããããããã¹ãŠãããã«ç€ºãããŠããããã§ã¯ãããŸããããããã§ãïŒïŒ
ç§ãã¡ã¯äž»ã«æ©èœãšã³ãžãã¢ãªã³ã°ãããã¯ã«é¢å¿ããããŸããããããã¹ãŠã®ãã¬ãŒã ã¯ãŒã¯ãšããã±ãŒãžãèŠããšãfeaturetoolsãæãæŽç·ŽãããŠãããtsfreshãªã©ã®ä»ã®ã©ã€ãã©ãªã®æ©èœãå«ãŸããŠããããšãããããŸãã
ãŸããfeaturetoolsã®å©ç¹ïŒåºåã¯ãŸã£ãããããŸããïŒïŒã¯æ¬¡ã®ãšããã§ãã
- ç®±ããåºããŠäžŠåã³ã³ãã¥ãŒãã£ã³ã°
- ç®±ããåºããŠå€ãã®æ©èœã®å¯çšæ§
- ã«ã¹ã¿ãã€ãºã®æè»æ§-éåžžã«è€éãªããšãèæ ®ããããšãã§ããŸã
- ç°ãªãããŒãã«éã®é¢ä¿ã®èª¬æïŒãªã¬ãŒã·ã§ãã«ïŒ
- ããå°ãªãã³ãŒã
- ééããç¯ãã«ãã
- ããèªäœã§ã¯ãç»é²ãSMSãªãã§ãã¹ãŠãç¡æã§ãïŒãã ããpypiã䜿çšïŒ
ããããããã¯ããã»ã©åçŽã§ã¯ãããŸããã
- ãã¬ãŒã ã¯ãŒã¯ã«ã¯ããçšåºŠã®åŠç¿ãå¿ èŠã§ãããå®å šãªç¿åŸã«ã¯ããªãã®æéãããããŸãã
- æã人æ°ã®ãã質åã¯ãŸã ããã°ãŒã°ã«ã§ãããããã¯ããã»ã©å€§ããªã³ãã¥ããã£ãæã£ãŠããŸããã
- 䜿çšèªäœãããã£ãŒãã£ã¹ããŒã¹ãäžå¿ èŠã«èšããŸããããèšç®æéãé·ããããããªãããã«æ³šæããå¿ èŠããããŸãã
ãã¬ãŒãã³ã°
featuretoolsã®æ§æäŸã瀺ããŸãã
次ã«ãç°¡åãªèª¬æãèšèŒãããã³ãŒãããããŸããæ©èœããŒã«ããã®ã¯ã©ã¹ãã¡ãœãããæ©èœã«ã€ããŠè©³ãã説æãããŠããŸããç¹ã«ããã¬ãŒã ã¯ãŒã¯ã®Webãµã€ãã®ããã¥ã¡ã³ãã§èªãããšãã§ããŸããå®éã®ã¿ã¹ã¯ã§ããã€ãã®èå³æ·±ãå¯èœæ§ã瀺ãå®çšçãªã¢ããªã±ãŒã·ã§ã³ã®äŸã«èå³ãããå Žåã¯ãã³ã¡ã³ããæžã蟌ãã§ãã ãããããããå¥ã®èšäºãæžãçããŸãã
ããã
æåã«ãEntitySetã¯ã©ã¹ã®ãªããžã§ã¯ããäœæããå¿ èŠããããŸãããã®ãªããžã§ã¯ãã«ã¯ãããŒã¿ãå«ãããŒãã«ãå«ãŸããŠããããããã®çžäºé¢ä¿ãèªèããŠããŸãã
ããŒã¿ãå«ã3ã€ã®ããŒãã«ãããããšãæãåºããŠãã ããã
- orders_metaïŒæ³šæã¡ã¿æ å ±ïŒ
- orders_items_listsïŒæ³šæã®ã¢ã€ãã ã«é¢ããæ å ±ïŒ
- ã¢ã€ãã ïŒèšäºãšãã®ããããã£ã®åç §ïŒ
次ã®ããã«èšè¿°ããŸãïŒããã«ã3ã€ã®ã¹ãã¢ã®ããŒã¿ã®ã¿ã䜿çšãããŸãïŒã
import featuretools as ft
es = ft.EntitySet(id='orders') # EntitySet
# pandas.DataFrame- (ft.Entity)
es = es.entity_from_dataframe(entity_id='orders_meta',
dataframe=orders_meta,
index='order_id',
time_index='order_creation_dt')
es = es.entity_from_dataframe(entity_id='orders_items',
dataframe=orders_items_lists,
index='order_item_id')
es = es.entity_from_dataframe(entity_id='items',
dataframe=items,
index='item',
variable_types={
'subclass': ft.variable_types.Categorical
})
#
# -,
# -
relationship_orders_items_list = ft.Relationship(es['orders_meta']['order_id'],
es['orders_items']['order_id'])
relationship_items_list_items = ft.Relationship(es['items']['item'],
es['orders_items']['item'])
#
es = es.add_relationship(relationship_orders_items_list)
es = es.add_relationship(relationship_items_list_items)
ãã£ããŒïŒããã§ãããããçš®é¡ã®å åãæ°ããããšãã§ãããªããžã§ã¯ããã§ããŸããã
ããªãåçŽãªæ©èœãèšç®ããããã®ã³ãŒããæäŸããŸãã泚æããšã«ãååã®äŸ¡æ Œãšæ°éã«é¢ããããŸããŸãªçµ±èšãæéããšã®ããã€ãã®æ©èœã泚æå ã®æãé »ç¹ãªè£œåãšååã®ã«ããŽãªãèšç®ããŸãïŒããŒã¿ã䜿çšããŠããŸããŸãªå€æãå®è¡ããé¢æ°ã¯ãfeaturetoolsã§ã¯ããªããã£ããšåŒã°ããŸãïŒ ..ã
orders_aggs, orders_aggs_cols = ft.dfs(
entityset=es,
target_entity='orders_meta',
agg_primitives=['mean', 'count', 'mode', 'any'],
trans_primitives=['hour', 'weekday'],
instance_ids=[200315133283, 200315129511, 200315130383],
max_depth=2
)
ããŒãã«ã«ã¯ããŒã«åããªããããããªããã£ãã¯é©çšãããŸããã§ãããäžè¬ã«ãfeaturetoolsèªäœãããŒã¿ã¿ã€ããåæããé©åãªé¢æ°ã®ã¿ãé©çšãããšäŸ¿å©ã§ãã
ãŸããæåã§èšç®ãã泚æãããã€ãæå®ããŸãããããã«ãããèšç®ããã°ãããããã°ã§ããŸãïŒäœãééã£ãæ§æãããå Žåã¯ã©ããªããŸããïŒã
ããã§ã¯ãæ©èœã«ããã«ããã€ãã®éèšãã€ãŸãããŒã»ã³ã¿ã€ã«ãè¿œå ããŸãããããã ããfeaturetoolsã«ã¯ãããããèšç®ããããã®çµã¿èŸŒã¿ããªããã£ãããããŸãããã ããããªãã¯ãããèªåã§æžãå¿ èŠããããŸãã
from featuretools.variable_types import Numeric
from featuretools.primitives.base.aggregation_primitive_base import make_agg_primitive
def percentile05(x: pandas.Series) -> float:
return numpy.percentile(x, 5)
def percentile25(x: pandas.Series) -> float:
return numpy.percentile(x, 25)
def percentile75(x: pandas.Series) -> float:
return numpy.percentile(x, 75)
def percentile95(x: pandas.Series) -> float:
return numpy.percentile(x, 95)
percentiles = [percentile05, percentile25, percentile75, percentile95]
custom_agg_primitives = [make_agg_primitive(function=fun,
input_types=[Numeric],
return_type=Numeric,
name=fun.__name__)
for fun in percentiles]
ãããŠãããããèšç®ã«è¿œå ããŸãã
orders_aggs, orders_aggs_cols = ft.dfs(
entityset=es,
target_entity='orders_meta',
agg_primitives=['mean', 'count', 'mode', 'any'] + custom_agg_primitives,
trans_primitives=['hour', 'weekday'],
instance_ids=[200315133283, 200315129511, 200315130383],
max_depth=2
)
ãã®åŸããã¹ãŠãåãã§ãããããŸã§ã®ãšããããã¹ãŠãéåžžã«ã·ã³ãã«ã§ç°¡åã§ãïŒãã¡ããæ¯èŒçïŒã
æ©èœèšç®æ©ãä¿åããŠãã¢ãã«å®è¡ã®æ®µéãã€ãŸããµãŒãã¹ã§äœ¿çšãããå Žåã¯ã©ããªããŸããïŒ
æŠéäžã®Featuretools
ããããäž»ãªåé¡ãå§ãŸããŸãã
å泚ã®ç¹æ§ãèšç®ããã«ã¯ãEntitySetãå床äœæããŠãã¹ãŠã®æäœãå®è¡ããå¿ èŠããããŸãããŸãã倧ããªããŒãã«ã®å Žåãpandas.DataFrameãªããžã§ã¯ããEntitySetã«ã¹ããŒããã®ã¯ããæ®éã®ããã§ããã1ã€ã®è¡ããDataFrameã«å¯ŸããŠåæ§ã®æäœãå®è¡ããŸãïŒããŒãã«ã«ã¯ãã§ãã¯ä»ãã®ãªããžã§ã¯ããå€ããããŸããããã§ãã¯ããšã«å¹³å3.3ã®äœçœ®ãã€ãŸãååã§ã¯ãããŸããïŒ-ããã»ã©ã§ããªããçµå±ã®ãšããããã®ãããªãªããžã§ã¯ãã®äœæãšãã®å©ããåããèšç®ã«ã¯ãå¿ ç¶çã«ãªãŒããŒããããå«ãŸããŸããã€ãŸããããšãã°ãä»»æã®ãµã€ãºã®ãªããžã§ã¯ããäœæãããšãã®ã¡ã¢ãªå²ãåœãŠãšåæåããŸãã¯è€æ°ã®æ©èœãåæã«èšç®ãããšãã®äžŠååããã»ã¹èªäœã«å¿ èŠãªãåé€ã§ããªãæ°ã®æäœãå«ãŸããŸãã
ãããã£ãŠãåœç€Ÿã®è£œåã®ãäžåºŠã«1ã€ã®æ³šæãã¢ãŒãã§ã¯ãæ©èœããŒã«ã¯æé«ã®å¹çã瀺ããããµãŒãã¹å¿çæéã®å¹³å75ïŒ ãå ããŸãïŒããŒããŠã§ã¢ã«å¿ããŠå¹³å150ã200ããªç§ïŒãæ¯èŒã®ããã«ïŒæ¢è£œã®æ©èœã§catboostã䜿çšããŠäºæž¬ãèšç®ããã«ã¯ããµãŒãã¹å¿çæéã®3ïŒ ãã€ãŸã10ããªç§ä»¥äžããããŸãã
ããã«ãã«ã¹ã¿ã ããªããã£ãã®äœ¿çšã«é¢é£ããå¥ã®èœãšãç©ŽããããŸããäºå®ãäœæããããªããã£ããå«ãã¯ã©ã¹ã®ãªããžã§ã¯ãã¯ãã¯ã«ã¹ãããŠããªãããããã¯ã«ã¹ã«åçŽã«ä¿åããããšã¯ã§ããŸããã
次ã«ãäœæããããªããã£ããå«ãFeatureBaseãªããžã§ã¯ãã®ãªã¹ããä¿åã§ããçµã¿èŸŒã¿ã®save_featuresïŒïŒé¢æ°ã䜿çšããŠã¿ãŸãããïŒ
ãããã¯ä¿åãããŸãããäºåã«åäœæããªããšãåŸã§load_featuresïŒïŒé¢æ°ã䜿çšããŠèªã¿åãããšã¯ã§ããŸãããã€ãŸããçè«çã«ã¯ãã£ã¹ã¯ããèªã¿åãå¿ èŠã®ããããªããã£ããæåã«äœæãçŽããŠãäºåºŠãšäœ¿çšããªãããã«ããŸãã
次ã®ããã«ãªããŸãã
from __future__ import annotations
import multiprocessing
import pickle
from typing import List, Optional, Any, Dict
import pandas
from featuretools import EntitySet, dfs, calculate_feature_matrix, save_features, load_features
from featuretools.feature_base.feature_base import FeatureBase, AggregationFeature
from featuretools.primitives.base.aggregation_primitive_base import make_agg_primitive
# -
# ,
#
#
# ( ),
# ,
class AggregationFeaturesCalculator:
def __init__(self,
target_entity: str,
agg_primitives: List[str],
custom_primitives_params: Optional[List[Dict[str, Any]]] = None,
max_depth: int = 2,
drop_contains: Optional[List[str]] = None):
if custom_primitives_params is None:
custom_primitives_params = []
if drop_contains is None:
drop_contains = []
self._target_entity = target_entity
self._agg_primitives = agg_primitives
self._custom_primitives_params = custom_primitives_params
self._max_depth = max_depth
self._drop_contains = drop_contains
self._features = None # ( ft.FeatureBase)
@property
def features_are_built(self) -> bool:
return self._features is not None
@property
def features(self) -> List[AggregationFeature]:
if self._features is None:
raise AttributeError('features have not been built yet')
return self._features
#
def build_features(self, entity_set: EntitySet) -> None:
custom_primitives = [make_agg_primitive(**primitive_params)
for primitive_params in self._custom_primitives_params]
self._features = dfs(
entityset=entity_set,
target_entity=self._target_entity,
features_only=True,
agg_primitives=self._agg_primitives + custom_primitives,
trans_primitives=[],
drop_contains=self._drop_contains,
max_depth=self._max_depth,
verbose=False
)
# ,
#
@staticmethod
def calculate_from_features(features: List[FeatureBase],
entity_set: EntitySet,
parallelize: bool = False) -> pandas.DataFrame:
n_jobs = max(1, multiprocessing.cpu_count() - 1) if parallelize else 1
return calculate_feature_matrix(features=features, entityset=entity_set, n_jobs=n_jobs)
#
def calculate(self, entity_set: EntitySet, parallelize: bool = False) -> pandas.DataFrame:
if not self.features_are_built:
self.build_features(entity_set)
return self.calculate_from_features(features=self.features,
entity_set=entity_set,
parallelize=parallelize)
#
# ,
# save_features()
#
@staticmethod
def save(calculator: AggregationFeaturesCalculator, path: str) -> None:
result = {
'target_entity': calculator._target_entity,
'agg_primitives': calculator._agg_primitives,
'custom_primitives_params': calculator._custom_primitives_params,
'max_depth': calculator._max_depth,
'drop_contains': calculator._drop_contains
}
if calculator.features_are_built:
result['features'] = save_features(calculator.features)
with open(path, 'wb') as f:
pickle.dump(result, f)
#
@staticmethod
def load(path: str) -> AggregationFeaturesCalculator:
with open(path, 'rb') as f:
arguments_dict = pickle.load(f)
# ...
if arguments_dict['custom_primitives_params']:
custom_primitives = [make_agg_primitive(**custom_primitive_params)
for custom_primitive_params in arguments_dict['custom_primitives_params']]
features = None
#
if 'features' in arguments_dict:
features = load_features(arguments_dict.pop('features'))
calculator = AggregationFeaturesCalculator(**arguments_dict)
if features:
calculator._features = features
return calculator
loadïŒïŒé¢æ°ã§ã¯ã䜿çšãããªãããªããã£ãïŒcustom_primitiveså€æ°ã宣èšïŒãäœæããå¿ èŠããããŸãããã ããããããªããšãload_featuresïŒïŒé¢æ°åŒã³åºãã®å Žæã§ã®æ©èœã®ããŒãã倱æããRuntimeErrorïŒã¢ãžã¥ãŒã« "featuretools.primitives.base.aggregation_primitive_base"ã®ããªããã£ã "percentile05"ãèŠã€ãããŸããã
ããŸãè«ççã§ã¯ãªãããšãããããŸãããæ©èœããŸããç¹å®ã®ããŒã¿åœ¢åŒã«æ¢ã«é¢é£ä»ããããŠããèšç®æ©ïŒæ©èœã¯ãå€èªäœããªããŠããèšç®ãããEntitySetã«é¢é£ä»ããããŠããããïŒãšãæå®ãããããªããã£ãã®ãªã¹ãã®ã¿ãå«ãèšç®æ©ã®äž¡æ¹ãä¿åã§ããŸãã
ããããå°æ¥çã«ã¯ãããä¿®æ£ãããFeatureBaseãªããžã§ã¯ãã®ä»»æã®ã»ããã䟿å©ã«ä¿åã§ããããã«ãªãã§ãããã
ãªãããã䜿çšããã®ã§ããïŒ
éçºæéã®èŠ³ç¹ããã¯å®äŸ¡ã§ãããªãããæ¢åã®è² è·ã§ã®å¿çæéã¯äœè£ãæã£ãŠSLAïŒ5ç§ïŒã«åãŸãããã§ãã
ãã ããé »ç¹ã«åä¿¡ããèŠæ±ã«è¿ éã«å¿çããå¿ èŠããããµãŒãã¹ã®å ŽåãéåæåŒã³åºãã®ãããªè¿œå ã®ãã¹ã¯ã¯ããããªãã§æ©èœããŒã«ã䜿çšãããšåé¡ãçºçããããšã«æ³šæããŠãã ããã
ããã¯ãåŠç¿æ®µéãšæšè«æ®µéã§æ©èœããŒã«ã䜿çšããçµéšã§ãã
ãã®ãã¬ãŒã ã¯ãŒã¯ã¯ããã¬ãŒãã³ã°çšã®å€æ°ã®æ©èœããã°ããèšç®ããããã®ããŒã«ãšããŠéåžžã«åªããŠãããéçºæéãå€§å¹ ã«ççž®ãããšã©ãŒã®å¯èœæ§ãæžãããŸãã
æ€éã®æ®µéã§ããã䜿çšãããã©ããã¯ããªãã®ä»äºã«äŸåããŸãã