Действие SAS для предоставления статистики вероятностей класса - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть вектор номинальных значений, и мне нужно знать вероятность появления каждого из номинальных значений. В основном, мне нужны те, чтобы получить min, max, mean, std вероятности соблюдения номинальных значений и получить значение Class Entropy.

Например, предположим, что существует набор данных, в котором цель прогнозирует 0, 1 или 2. В наборе данных обучения. Мы можем посчитать количество записей, для которых их цель равна 1, и назвать его n_1, и аналогично мы можем определить n_0 и n_2. Тогда вероятность наблюдения класса 1 в наборе обучающих данных просто p_1=n_1/(n_0 + n_2). После получения p_0, p_1 и p_2 можно получить минимальное, максимальное, среднее и стандартное значения этих вероятностей.

Легко получить это в python с помощью pandas, но вы хотите избежать чтения набора данных дважды. Мне было интересно, есть ли какое-либо действие CAS в SAS, которое может предоставить его мне. Обратите внимание, что я использую Python API от SAS до swat, и мне нужно иметь API в python.

1 Ответ

1 голос
/ 13 февраля 2020

Я нашел следующее решение, и оно отлично работает. Он использует s.dataPreprocess.highcardinality для получения количества классов, а затем использует s.dataPreprocess.binning для получения количества наблюдений в каждом классе. Тогда есть только некоторые простые вычисления.

import swat 
# create a CAS server 
s = swat.CAS(server, port)

# load the table 
tbl_name = 'hmeq'
s.upload("./data/hmeq.csv", casout=dict(name=tbl_name, replace=True))

# call to get the number of classes
cardinality_result = s.dataPreprocess.highcardinality(table=tbl_name, vars=[target_var])
cardinality_result_df = pd.DataFrame(cardinality_result["HighCardinalityDetails"])
number_of_classes = int(cardinality_result_df["CardinalityEstimate"])

# call dataPreprocess.binning action to get the probability of each class  
s.loadactionset(actionset="dataPreprocess")
result_binning = s.dataPreprocess.binning(table=tbl_name, vars=[target_var], nBinsArray=[number_of_classes])
result_binning_df = pd.DataFrame(result_binning["BinDetails"])

probs = result_binning_df["NInBin"]/result_binning_df["NInBin"].sum()
prob_min = probs.min()
prob_max = probs.max()
prob_mean = probs.mean()
prob_std = probs.std()        
entropy = -sum(probs*np.log2(probs))
...