关于机器学习大作业的探索

读取数据

In [27]:

import pandas as pd
import re
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import warnings
warnings.filterwarnings("ignore")
# 让所有行和列都显示出来
pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)

In [28]:

# 读取数据
train_data = pd.read_csv('/home/mw/input/MLearn9130/训练营.csv')
test_data = pd.read_csv('/home/mw/input/MLearn9130/测试集.csv')
train_data.head(10)
test_data.head()

Out[28]:

Age
年龄Gender 性别Region
区域Weight 体重Height 身高Body Mass Index
体重指数Obesity 肥胖腰围Waist 腰围Maximum Blood Pressure 最高血压Minimum Blood Pressure 最低血压Good Cholesterol 好胆固醇Bad Cholesterol 坏胆固醇Total Cholesterol 总胆固醇Dyslipidemia
血脂异常PVDPhysical Activity 体育活动Education 教育Unmarried 未婚Income 收入Source of Care 护理来源PoorVision 视力不佳Alcohol Consumption 饮酒HyperTension 高血压Family HyperTension 家庭高血压Diabetes 糖尿病Family Diabetes 家族糖尿病Hepatitis 肝炎Family Hepatitis 家族肝炎Chronic Fatigue 慢性疲劳id
034Msouth65.0163.324.370.079.3113.079.048.0154.0202.0001.01.00.01.0Private Hospital0.000.000.000.00.00.03692
127Feast91.9177.829.070.0100.8119.076.046.0151.0197.0002.00.01.01.0Private Hospital0.000.000.000.00.00.03761
232Msouth63.2157.025.640.078.397.042.043.0132.0175.0002.00.00.00.0clinic0.000.000.010.00.00.05670
320Fwest78.2178.324.600.084.6111.081.056.0131.0187.0003.01.01.00.0Private Hospital0.000.000.000.00.00.02478
467Meast114.7168.040.641.0125.5145.077.058.0122.0180.0001.00.01.00.0Private Hospital0.011.001.000.00.00.04107

In [29]:

# 数据处理

# 先把列名,都改成中文的,去掉英文的
old_columns = train_data.columns.tolist()
new_columns = train_data.columns.str.split(
    r'\n').str[-1].str.split('\u2028').str[-1].tolist()
columns_dic = dict(zip(old_columns, new_columns))

train_data.rename(columns=columns_dic, inplace=True)
test_data.rename(columns=columns_dic, inplace=True)
train_data.columns

Out[29]:

Index(['年龄', '性别', '区域', '体重', '身高', '体重指数', '肥胖腰围', '腰围', '最高血压', '最低血压',
       '好胆固醇', '坏胆固醇', '总胆固醇', '血脂异常', 'PVD', '体育活动', '教育', '未婚', '收入', '护理来源',
       '视力不佳', '饮酒', '高血压', '家庭高血压', '糖尿病', '家族糖尿病', '肝炎', '家族肝炎', '慢性疲劳',
       'ALF', 'id'],
      dtype='object')

In [30]:

#查看数据情况,是否有异常数据
train_data.describe()

Out[30]:

年龄体重身高体重指数肥胖腰围腰围最高血压最低血压好胆固醇坏胆固醇总胆固醇血脂异常PVD体育活动教育未婚收入视力不佳饮酒高血压家庭高血压糖尿病家族糖尿病肝炎家族肝炎慢性疲劳ALFid
count4200.0000004106.0000004095.0000004048.0000004048.000004055.0000004055.0000004024.0000004193.0000004193.0000004195.0000004200.0000004200.0000004195.000004188.0000003993.0000003654.0000003932.0000004200.0000004158.0000004200.0000004200.0000004200.0000004190.0000004197.0000004182.0000004200.0000004200.000000
mean49.17904879.027896167.06026928.2578240.3125096.796917125.43107371.60909551.897687152.192702204.0967820.1071430.0397622.025030.4379180.3831710.4146140.0612920.3078570.4047620.2345240.1035710.3116670.0649160.0226350.0301290.0761903000.830238
std18.90535819.36057610.1779746.1450810.4635715.09807421.16874012.46134615.77907743.02750342.6740840.3093320.1954230.822080.4961900.4862200.4927230.2398960.4616620.4909050.4237510.3047400.4632300.2464080.1487550.1709630.2653341741.236022
min20.00000033.700000130.40000016.0300000.0000058.60000072.00000010.00000012.00000042.00000080.0000000.0000000.0000001.000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.000000
25%33.00000065.300000159.50000024.0400000.0000086.000000111.00000064.00000041.000000122.000000176.0000000.0000000.0000001.000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000001494.750000
50%47.00000076.600000166.70000027.3200000.0000096.200000122.00000072.00000049.000000148.000000200.0000000.0000000.0000002.000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000003015.500000
75%64.00000089.400000174.30000031.2900001.00000106.200000136.00000079.00000061.000000178.000000230.0000000.0000000.0000002.000001.0000001.0000001.0000000.0000001.0000001.0000000.0000000.0000001.0000000.0000000.0000000.0000000.0000004507.000000
max85.000000188.300000199.40000062.9900001.00000163.600000233.000000132.000000142.000000560.000000606.0000001.0000001.0000004.000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000001.0000005998.000000

从上面的描述看,一共有4200个数据,看起来没有非常异常的数据,但是很多列是有缺失数据的

特征增强

特征观察

In [31]:

# 把 分类的数据列 和 数值型数据列 分开

cate_columns = [
    col for col in train_data.columns if train_data[col].max() == 1]
cate_columns.extend(['性别', '区域', '体育活动', '护理来源'])
number_columns = [col for col in train_data.columns if col not in cate_columns]

In [32]:

# 数值型特征观察

for col in number_columns:
    # 确诊急性肝衰竭
    plt.hist(train_data[train_data['ALF'] == 1][col],
             bins=10, alpha=0.8, label='确诊急性肝衰竭患者')
    # 没有急性肝衰竭
    plt.hist(train_data[train_data['ALF'] == 0][col],
             bins=10, alpha=0.2, label='没有急性肝衰竭患者')
    plt.legend(loc='upper left')
    plt.xlabel(col)
    plt.ylabel('计数')
    plt.title('特征【{}】的分布图'.format(col))
    plt.show()

In [33]:

# 看分类型变量的分布情况
sns.set_palette('muted')
cate_features_columns = [x for x in cate_columns if x != 'ALF']
for col in cate_features_columns:
    # 分组后计数
    grouped = train_data[[col, 'ALF']].groupby([col, 'ALF']).size()
    # 计算每组的百分比,level=0 是针对第一级别的分类里再次计算百分比
    group_percentages = grouped.groupby(
        level=0).apply(
        lambda x: 100 *
        x /
        float(
            x.sum()))
    group_percentages.unstack().plot(kind='bar', stacked=True)

    plt.legend(loc='upper left')
    plt.xlabel(col)
    plt.ylabel('百分比')
    plt.title('特征【{}】的分布图'.format(col))
    plt.show()

从上面的分布图里有以下大致的观察:
急性肝炎患者相比非急性肝炎患者:平均年龄更大,平均身高更低,平均腰围更大,平均的最高血压更高,平均的最低血压更低,好胆固醇更少
肥胖腰围更多,患有PVD 的更多,没有收到教育的更多,已婚的更多,没有收入的更多,视力不佳的更多,饮酒的、高血压的更多,没有家庭高血压的更多,有糖尿病的更多,患有肝炎的更容易患病,有家族肝炎的,有慢性疲劳的,东部和北部的 比 西部南部的更多,体育活动更少的,更容易患病

但是有些特征 患病和不患病区别不明显,而且没有患病的用户数量较大,无法判断是 是特征与结果不相关/还是不明显

特征处理

缺失值填充,同时标准化 数值特征

看前面数值型的数据基本符合正态分布,没有非常离谱的异常数据点
所以在缺失值填充这里,数值型数据我还是选择了均值

In [34]:

# 把内容是文本的列单独拿出来
def find_object_columns(data):
    object_columns = []
    for x in data.columns:
        if data[x].dtype == 'object':
            object_columns.append(x)
    return object_columns


need_one_hot_list = find_object_columns(train_data)
cate_columns_not_need_onehot = [
    x for x in cate_columns if x not in need_one_hot_list]
cate_columns_not_need_onehot

Out[34]:

['肥胖腰围',
 '血脂异常',
 'PVD',
 '教育',
 '未婚',
 '收入',
 '视力不佳',
 '饮酒',
 '高血压',
 '家庭高血压',
 '糖尿病',
 '家族糖尿病',
 '肝炎',
 '家族肝炎',
 '慢性疲劳',
 'ALF',
 '体育活动']

In [35]:

from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder

num_cate_columns = [x for x in cate_columns_not_need_onehot if x != 'ALF']

num_transformer = Pipeline([('mean_imputer', SimpleImputer(strategy='mean')),
                            ('std_Scaler', StandardScaler())])

cate_transformer = Pipeline(
    [('most_frequent_imputer', SimpleImputer(strategy='most_frequent'))])

# 处理器接收的都是ndarray
# 预处理器,这个返回的结果就是两个合并起来的类型
# 这里先处理:数值类型的列(分类列和数值列)
preprocesser = ColumnTransformer(transformers=[
    ('num', num_transformer, number_columns),
    ('cate', cate_transformer, num_cate_columns)
])

cols_transformed = number_columns + num_cate_columns

train_data_X = train_data.drop('ALF', axis=1)

train_imputed_part1 = preprocesser.fit_transform(train_data_X)
train_imputed_part1_df = pd.DataFrame(
    train_imputed_part1, columns=cols_transformed)
# 上面已经学习了train_data 的统计特性,下面应该用相同的统计特性转换测试数据,所以直接transform
test_imputed_part1 = preprocesser.transform(test_data)
test_imputed_part1_df = pd.DataFrame(
    test_imputed_part1, columns=cols_transformed)

In [36]:

# 再单独处理文字内容的列


from sklearn.preprocessing import OneHotEncoder
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer

# OneHot编码的转化器
onehot_transformer = Pipeline(steps=[
    ('onehot', OneHotEncoder(handle_unknown='ignore', sparse=False)),
])

# 定义预处理器
preprocessor_onehot = ColumnTransformer(
    transformers=[
        ('onehot', onehot_transformer, need_one_hot_list),
    ])

train_cate_columns_onehotted = preprocessor_onehot.fit_transform(train_data_X)
test_cate_columns_onehotted = preprocessor_onehot.transform(test_data)

# 获取经过 OneHotEncoder 处理的所有列名
onehot_features = preprocessor_onehot.named_transformers_[
    'onehot'][0].get_feature_names(need_one_hot_list)

train_onehotted_part2 = pd.DataFrame(
    train_cate_columns_onehotted,
    columns=onehot_features)
test_onehotted_part2 = pd.DataFrame(
    test_cate_columns_onehotted,
    columns=onehot_features)

In [37]:

test_onehotted_part2.head()

Out[37]:

性别_F性别_M区域_east区域_north区域_south区域_west护理来源_护理来源_Governament Hospital护理来源_Never Counsulted护理来源_Private Hospital护理来源_clinic
00.01.00.00.01.00.00.00.00.01.00.0
11.00.01.00.00.00.00.00.00.01.00.0
20.01.00.00.01.00.00.00.00.00.01.0
31.00.00.00.00.01.00.00.00.01.00.0
40.01.01.00.00.00.00.00.00.01.00.0

In [38]:

# 把处理完的 两部分数据合并
train_data_finished_X = pd.concat(
    [train_imputed_part1_df, train_onehotted_part2], axis=1)
test_data_finished = pd.concat(
    [test_imputed_part1_df, test_onehotted_part2], axis=1)

In [39]:

train_data_finished_X.head()

Out[39]:

年龄体重身高体重指数腰围最高血压最低血压好胆固醇坏胆固醇总胆固醇id肥胖腰围血脂异常PVD教育未婚收入视力不佳饮酒高血压家庭高血压糖尿病家族糖尿病肝炎家族肝炎慢性疲劳体育活动性别_F性别_M区域_east区域_north区域_south区域_west护理来源_护理来源_Governament Hospital护理来源_Never Counsulted护理来源_Private Hospital护理来源_clinic
01.894977-1.540613-2.852132-0.397510-0.0672082.671897-0.623904-0.374123-0.888481-1.0340780.6790060.00.00.00.01.00.00.00.01.00.01.00.00.00.00.02.00.01.00.00.01.00.00.00.00.01.00.0
10.2021341.3621530.1134211.4741391.6586350.604346-0.213931-0.881607-0.353430-0.6823250.4521291.00.00.00.00.01.00.01.01.00.01.00.00.00.00.02.01.00.01.00.00.00.00.00.00.01.00.0
21.154358-0.1216220.202984-0.2383610.5260501.277503-0.623904-0.945042-0.353430-0.705775-1.0016090.00.00.00.00.00.00.01.01.00.00.00.00.00.00.04.01.00.00.00.01.00.00.00.00.01.00.0
3-0.908795-0.403749-0.234883-0.3278820.000208-1.415122-2.0178100.9580230.6003580.959188-0.3083410.00.00.01.00.01.00.01.00.00.00.00.00.00.00.02.00.01.01.00.00.00.00.00.00.01.00.0
4-1.543611-1.490457-0.782216-1.380581-1.887432-1.126626-1.607838-0.881607-1.842269-2.183137-1.6047010.00.00.00.01.01.00.00.00.00.00.00.00.00.00.02.01.00.00.00.01.00.00.00.01.00.00.0

特征选择

In [40]:

# 画热力图,看特征之间的相关性
sns.heatmap(train_data_finished_X.corr(), cmap='Blues')

Out[40]:

<matplotlib.axes._subplots.AxesSubplot at 0x7f46e96fe908>

In [41]:

# 特征选择,只选择相关性超过0.04的特征
train_data_finished = pd.concat(
    [train_data_finished_X, train_data['ALF']], axis=1)
feature_mask = train_data_finished.corr()['ALF'].abs() > 0.04
high_related_feature = train_data_finished.columns[feature_mask]
high_related_feature
# len(feature_mask)

Out[41]:

Index(['年龄', '身高', '腰围', '最高血压', '最低血压', 'PVD', '教育', '未婚', '收入', '视力不佳', '饮酒',
       '高血压', '家庭高血压', '糖尿病', '肝炎', '慢性疲劳', '体育活动', '区域_east', '区域_south',
       '护理来源_Never Counsulted', '护理来源_Private Hospital', 'ALF'],
      dtype='object')

机器学习

寻找合适的模型和参数

In [42]:

# 空准确率
train_data_finished['ALF'].value_counts(normalize=True)

# 空准确率就达到了 92%以上,存在数据不平衡的问题

Out[42]:

0.0    0.92381
1.0    0.07619
Name: ALF, dtype: float64

In [45]:

# 我自己从训练数据里再拆出来:训练集合,和测试集合,演练一下模型的预测能力
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.metrics import f1_score, precision_score, recall_score
from imblearn.over_sampling import SMOTE

# 尝试用SMOTE 的方法生成新的样本,解决数据不平衡的问题

sm = SMOTE(random_state=2)

X_train, X_test, y_train, y_test = train_test_split(
    train_data_finished[high_related_feature], train_data_finished['ALF'], test_size=0.3, random_state=123)

X_train_res, y_train_res = sm.fit_resample(X_train, y_train)

对于不平衡的数据,F1 score 和 AUC 是两个非常常用的指标,它们同时考虑了正类和负类的情况。

F1 score 是 precision 和 recall 的调和平均,它的优点是既考虑了正类的预测准确度(precision),又考虑了正类的覆盖面(recall)
AUC 是 Receiver Operating Characteristic curve (ROC curve) 下的面积,考虑到了不同的分类阈值下模型的表现,同样是适合处理数据不平衡的指标。

In [46]:

# 然后找到最合适的模型
from sklearn.model_selection import GridSearchCV


def get_best_model_and_accuracy(
        model, params, X_train, y_train, X_test, y_test):
    grid = GridSearchCV(model,  # 要搜索的模型
                        params,  # 要尝试的参数
                        error_score=0.)  # 如果报错,结果是0
    grid.fit(X_train, y_train)  # 拟合模型和参数
    y_pre = grid.predict(X_test)
    accuracy = accuracy_score(y_test, y_pre)

    f1 = f1_score(y_test, y_pre)
    precision = precision_score(y_test, y_pre)
    recall = recall_score(y_test, y_pre)
    # 经典的性能指标
    print("Best Accuracy: {}".format(accuracy))
    # 得到最佳准确率的最佳参数
    print("Best Parameters: {}".format(grid.best_params_))
    # 拟合的平均时间(秒)
    print("Average Time to Fit (s): {}".format(
        round(grid.cv_results_['mean_fit_time'].mean(), 3)))
    # 预测的平均时间(秒)
    # 从该指标可以看出模型在真实世界的性能
    print("Average Time to Score (s): {}".format(
        round(grid.cv_results_['mean_score_time'].mean(), 3)))

    print('F1 score: ', f1)
    print('Precision: ', precision)
    print('Recall: ', recall)


from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier

# 为网格搜索设置变量
# 先设置机器学习模型的参数

# 逻辑回归
lr_params = {'C': [1e-1, 1e0, 1e1, 1e2], 'penalty': ['l1', 'l2']}

# KNN
knn_params = {'n_neighbors': [1, 3, 5, 7]}

# 决策树
tree_params = {'max_depth': [None, 1, 3, 5, 7]}

# 随机森林
forest_params = {'n_estimators': [10, 50, 100],
                 'max_depth': [None, 1, 3, 5, 7]}


# 实例化机器学习模型
lr = LogisticRegression()
knn = KNeighborsClassifier()
d_tree = DecisionTreeClassifier()
forest = RandomForestClassifier()

In [52]:

get_best_model_and_accuracy(
    lr,
    lr_params,
    X_train_res,
    y_train_res,
    X_test,
    y_test)
Best Accuracy: 1.0
Best Parameters: {'C': 0.1, 'penalty': 'l2'}
Average Time to Fit (s): 0.349
Average Time to Score (s): 0.011
F1 score:  1.0
Precision:  1.0
Recall:  1.0

F1得分:F1得分是一个介于0和1之间的数,接近1意味着模型表现良好,接近0则表示表现差。F1得分是精确度和召回率的调和均值,试图平衡这两者。在你的结果中,F1得分是0.04255,这是一个相当低的分数,表明模型的精确度和召回率都较低。

精确度(Precision):精确度是指模型预测为正类的样本中真正为正类的比例。在你的结果中,精确度是0.4,表示40%的被模型预测为正类的样本实际上是正类。

召回率(Recall):召回率是指模型正确预测的正类样本占总的正类样本的比例。在你的结果中,召回率是0.02247,这意味着只有约2.25% 的实际正类被模型正确地预测为正类。

In [48]:

get_best_model_and_accuracy(
    knn,
    knn_params,
    X_train_res,
    y_train_res,
    X_test,
    y_test)
Best Accuracy: 0.9587301587301588
Best Parameters: {'n_neighbors': 1}
Average Time to Fit (s): 0.004
Average Time to Score (s): 0.385
F1 score:  0.7263157894736842
Precision:  0.6831683168316832
Recall:  0.7752808988764045

In [49]:

get_best_model_and_accuracy(
    d_tree,
    tree_params,
    X_train_res,
    y_train_res,
    X_test,
    y_test)
Best Accuracy: 1.0
Best Parameters: {'max_depth': None}
Average Time to Fit (s): 0.006
Average Time to Score (s): 0.002
F1 score:  1.0
Precision:  1.0
Recall:  1.0

In [50]:

get_best_model_and_accuracy(
    forest,
    forest_params,
    X_train_res,
    y_train_res,
    X_test,
    y_test)
Best Accuracy: 1.0
Best Parameters: {'max_depth': None, 'n_estimators': 50}
Average Time to Fit (s): 0.115
Average Time to Score (s): 0.008
F1 score:  1.0
Precision:  1.0
Recall:  1.0

这次看起来,knn模型可以更好的解决过拟合的问题,用knn模型继续看

In [60]:

high_related_feature

Out[60]:

Index(['年龄', '身高', '腰围', '最高血压', '最低血压', 'PVD', '教育', '未婚', '收入', '视力不佳', '饮酒',
       '高血压', '家庭高血压', '糖尿病', '肝炎', '慢性疲劳', '体育活动', '区域_east', '区域_south',
       '护理来源_Never Counsulted', '护理来源_Private Hospital', 'ALF'],
      dtype='object')

In [65]:

# 用交叉验证的方式看 knn 模型的表现情况
from sklearn.model_selection import cross_val_score
from sklearn.metrics import make_scorer, f1_score, recall_score


high_related_feature = [i for i in high_related_feature if i != 'ALF']
X_train_res_all, y_train_res_all = sm.fit_resample(
    train_data_finished[high_related_feature], train_data['ALF'])

test_imputed_test = test_data_finished[high_related_feature]
model = KNeighborsClassifier(n_neighbors=1)

f1 = cross_val_score(
    model,
    X_train_res_all,
    y_train_res_all,
    cv=5,
    scoring=make_scorer(
        f1_score,
        average='macro'))
recall = cross_val_score(
    model,
    X_train_res_all,
    y_train_res_all,
    cv=5,
    scoring=make_scorer(
        recall_score,
        average='macro'))

print("f1: ", f1)

# 输出平均准确性
print("recall ", recall)
f1:  [0.9398706  0.93399325 0.9228865  0.93661314 0.9398706 ]
recall  [0.94007732 0.93427835 0.92332474 0.93685567 0.94007732]

模型训练,输出预测结果

In [72]:

# 用knn 模型做预测模型

# 对训练集的所有数据做重采样

model.fit(X_train_res_all, y_train_res_all)

result_y = model.predict(test_data_finished[high_related_feature])

In [73]:

# 结果写入csv文件
result = pd.concat([test_data['id'], pd.DataFrame(
    result_y, columns=['ALF'])], axis=1)
result.to_csv('logistic_test1.csv', encoding='utf-8', index=False)
  • 16
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
作业一(Matlab) 假设x=(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20),y=( 2.94, 4.53, 5.96, 7.88, 9.02, 10.94, 12.14, 13.96, 14.74, 16.68, 17.79, 19.67, 21.20, 22.07, 23.75, 25.22, 27.17, 28.84, 29.84, 31.78).请写出拟合的直线方程,并画图(包括原数据点及拟合的直线),请打印出来。 请使用线性回归模型来拟合bodyfat数据。数据集介绍可阅读:https://www.mathworks.com/help/nnet/examples/body-fat-estimation.html 在matlab中,在命令行中输入[X,Y] = bodyfat_dataset; 即可获得一个拥有13个属性,252个样本的数据集。使用前200个样本来获得模型,并写出你所获得的模型。使用后52个样本做测试,汇报你所获得的泛化误差。 编程实现对数回归,并给出教材89页上的西瓜数据集3.0上的结果。要求采用4折交叉验证法来评估结果。因为此处一共17个样本,你可以去掉最后一个样本,也可以用所有数据,然后测试用5个样本。在汇报结果时,请说明你的选择。请在二维图上画出你的结果(用两种不同颜色或者形状来标注类别),同时打印出完整的代码。 作业二 采用信息增益准则,基于表4.2中编号为1、2、3、6、7、9、10、14、15、16、17的11个样本的色泽、根蒂、敲声、文理属性构建决策树。(本次作业可以用笔算,鼓励编程实现,但都需要列出主要步骤,其中log2(3)=1.585,log2(5)=2.322,log2(6)=2.585,log2(7)=2.807,log2(9)=3.17,log2(10)=3.322,log2(11)=3.459) 用表4.2中编号为4、5、8、11、12、13的样本做测试集,对上题的训练数据采用预剪枝策略构建决策树,并汇报验证集精度。 用表4.2中编号为4、5、8、11、12、13的样本做测试集,对题1所构建的决策树进行后剪枝,并汇报验证集精度。 作业三(Matlab) 试编程实现累积BP算法,在西瓜数据集2.0上(用训练数据)训练一个单隐层网络,用验证集计算出均方误差。要自己实现,不能直接调用现成的库函数。 作业四 下载并安装libsvm,http://www.csie.ntu.edu.tw/~cjlin/libsvm/ ,在西瓜数据集3.0a上分别用线性核训练一个SVM。用正类1-6和负类9-14作为训练集,其余作为测试集。C取不同的值,其它参数设为默认值。作出测试正确率随C取值变化的图,C=[1 100 10000 10^6 10^8]。 换成高斯核(宽度设为1),重复上题的步骤。 作业五 以西瓜数据集2.0(见教材76页表4.1)中样本1--16为训练集训练一个朴素贝叶斯分类器,对测试样本17进行分类。请写出详细的计算过程。 假设x_k是一个班上学生的分数,对应的分数及其分布是 x_1=30, P1=0.5,一共有14个学生; x_2=18, P2=mu,有6个学生; x_3=20, P3=2mu,有9个学生; x_4=23, P4=0.5-3mu,有10个学生; 通过最大对数似然法求出mu的值。 作业六(Python) 1 使用PCA对Yale人脸数据集进行降维,并分别观察前20、前100个特征向量所对应的图像。请随机选取3张照片来对比效果。数据集http://vision.ucsd.edu/content/yale-face-database

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴躁的秋秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值