国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

python算法演練_One Rule 算法(詳解)

2020-01-04 17:10:37
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

這樣某一個(gè)特征只有0和1兩種取值,數(shù)據(jù)集有三個(gè)類(lèi)別。當(dāng)取0的時(shí)候,假如類(lèi)別A有20個(gè)這樣的個(gè)體,類(lèi)別B有60個(gè)這樣的個(gè)體,類(lèi)別C有20個(gè)這樣的個(gè)體。所以,這個(gè)特征為0時(shí),最有可能的是類(lèi)別B,但是,還是有40個(gè)個(gè)體不在B類(lèi)別中,所以,將這個(gè)特征為0分到類(lèi)別B中的錯(cuò)誤率是40%。然后,將所有的特征統(tǒng)計(jì)完,計(jì)算所有的特征錯(cuò)誤率,再選擇錯(cuò)誤率最低的特征作為唯一的分類(lèi)準(zhǔn)則——這就是OneR。

現(xiàn)在用代碼來(lái)實(shí)現(xiàn)算法。

# OneR算法實(shí)現(xiàn)import numpy as npfrom sklearn.datasets import load_iris# 加載iris數(shù)據(jù)集dataset = load_iris()# 加載iris數(shù)據(jù)集中的data數(shù)組(數(shù)據(jù)集的特征)X = dataset.data# 加載iris數(shù)據(jù)集中的target數(shù)組(數(shù)據(jù)集的類(lèi)別)y_true = dataset.target# 計(jì)算每一項(xiàng)特征的平均值attribute_means = X.mean(axis=0)# 與平均值比較,大于等于的為“1”,小于的為“0”.將連續(xù)性的特征值變?yōu)殡x散性的類(lèi)別型。x = np.array(X >= attribute_means, dtype="int")from sklearn.model_selection import train_test_splitx_train, x_test, y_train, y_test = train_test_split(x, y_true, random_state=14)from operator import itemgetterfrom collections import defaultdict# 找到一個(gè)特征下的不同值的所屬的類(lèi)別。def train_feature_class(x, y_true, feature_index, feature_values):  num_class = defaultdict(int)  for sample, y in zip(x, y_true):    if sample[feature_index] == feature_values:      num_class[y] += 1  # 進(jìn)行排序,找出最多的類(lèi)別。按從大到小排列  sorted_num_class = sorted(num_class.items(), key=itemgetter(1), reverse=True)  most_frequent_class = sorted_num_class[0][0]  error = sum(value_num for class_num , value_num in sorted_num_class if class_num != most_frequent_class)  return most_frequent_class, error# print train_feature_class(x_train, y_train, 0, 1)# 接著定義一個(gè)以特征為自變量的函數(shù),找出錯(cuò)誤率最低的最佳的特征,以及該特征下的各特征值所屬的類(lèi)別。def train_feature(x, y_true, feature_index):  n_sample, n_feature = x.shape  assert 0 <= feature_index < n_feature  value = set(x[:, feature_index])  predictors = {}  errors = []  for current_value in value:    most_frequent_class, error = train_feature_class(x, y_true, feature_index, current_value)    predictors[current_value] = most_frequent_class    errors.append(error)  total_error = sum(errors)  return predictors, total_error# 找到所有特征下的各特征值的類(lèi)別,格式就如:{0:({0: 0, 1: 2}, 41)}首先為一個(gè)字典,字典的鍵是某個(gè)特征,字典的值由一個(gè)集合構(gòu)成,這個(gè)集合又是由一個(gè)字典和一個(gè)值組成,字典的鍵是特征值,字典的值為類(lèi)別,最后一個(gè)單獨(dú)的值是錯(cuò)誤率。all_predictors = {feature: train_feature(x_train, y_train, feature) for feature in xrange(x_train.shape[1])}# print all_predictors# 篩選出每個(gè)特征下的錯(cuò)誤率出來(lái)errors = {feature: error for feature, (mapping, error) in all_predictors.items()}# 對(duì)錯(cuò)誤率排序,得到最優(yōu)的特征和最低的錯(cuò)誤率,以此為模型和規(guī)則。這就是one Rule(OneR)算法。best_feature, best_error = sorted(errors.items(), key=itemgetter(1), reverse=False)[0]# print "The best model is based on feature {0} and has error {1:.2f}".format(best_feature, best_error)# print all_predictors[best_feature][0]# 建立模型model = {"feature": best_feature, "predictor": all_predictors[best_feature][0]}# print model# 開(kāi)始測(cè)試——對(duì)最優(yōu)特征下的特征值所屬類(lèi)別進(jìn)行分類(lèi)。def predict(x_test, model):  feature = model["feature"]  predictor = model["predictor"]  y_predictor = np.array([predictor[int(sample[feature])] for sample in x_test])  return y_predictory_predictor = predict(x_test, model)# print y_predictor# 在這個(gè)最優(yōu)特征下,各特征值的所屬類(lèi)別與測(cè)試數(shù)據(jù)集相對(duì)比,得到準(zhǔn)確率。accuracy = np.mean(y_predictor == y_test) * 100print "The test accuracy is {0:.2f}%".format(accuracy)from sklearn.metrics import classification_report# print(classification_report(y_test, y_predictor))

總結(jié):OneR算法,我在最開(kāi)始的以為它是找到一個(gè)錯(cuò)誤率最低的特征之后可以判斷所有特征的分類(lèi),其實(shí),現(xiàn)在明白它只能判斷這個(gè)特征下的各特征值的分類(lèi),所以,明顯它會(huì)有一些局限性。只是說(shuō)它比較快捷也比較簡(jiǎn)單明了。但是,還是得是情況而判斷是否使用它。

class      precision recall f1-score support

0              0.94     1.00    0.97       17
1              0.00     0.00    0.00       13
2              0.40     1.00    0.57        8

avg / total 0.51     0.66    0.55       38

注:

# 在上面代碼中。
for sample in x_test:
print sample[0]
# 得到的是x_test的第一列數(shù)據(jù)。而用下面的代碼得到的是x_test的第一行數(shù)據(jù)。
print x_test[0]
# 注意兩者區(qū)別

以上這篇python算法演練_One Rule 算法(詳解)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持VEVB武林網(wǎng)。

 
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 沛县| 沙河市| 丰台区| 囊谦县| 叶城县| 桃园县| 柘荣县| 手游| 栾川县| 镇康县| 应用必备| 西和县| 太湖县| 台州市| 洪江市| 临湘市| 万安县| 杨浦区| 淮安市| 策勒县| 肇东市| 耒阳市| 茌平县| 股票| 察雅县| 凤阳县| 虎林市| 安塞县| 政和县| 筠连县| 本溪市| 随州市| 琼海市| 夹江县| 定结县| 随州市| 盈江县| 侯马市| 巩留县| 连平县| 宁强县|