机器学习Day04(下)

如何判断特征的重要性?

        1. 使用决策树来判断特征的重要性

import joblib
_, data = joblib.load(filename="all_data.csblog")
X_train,y_train, _, _ = data
X_train.shape
y_train.shape

from sklearn.tree import DecisionTreeClassifier
dtc = DecisionTreeClassifier()
dtc.fit(X=X_train,y=y_train)

# 查看特征重要性 
feature_importances = dtc.feature_importances_

feature_importances.sort()
feature_importances

2. 分类问题的评价

  • 准确率 accuracy:预测正确的数量 / 总的测试数量

                样本均衡时,可靠,不同类别的样本,数量上不会相差太多。

               样本不均衡时,特别是深度学习模型,该指标有欺骗性。(梯度下降法)

  • 精准率 precision
  • 召回率 recall
  •  f1-score
from sklearn.metrics import accuracy_score
from sklearn.metrics import recall_score
from sklearn.metrics import precision_score
from sklearn.metrics import f1_score

accuracy_score(y_true=y_test, y_pred=y_pred)

recall_score(y_true = y_test, y_pred=y_pred,average=None)

precision_score(y_true = y_test, y_pred=y_pred,average=None)

f1_score(y_true = y_test, y_pred=y_pred,average=None)

3. 特征筛选

        干掉一部分不重要的特征,保留一部分重要特征,剩下的特征还是原来的一部分。(优化、裁员思想)

"""
抽取5个最重要的特征,然后测试准确率
"""
feature_importances = dtc.feature_importances_
selected_feature_idex = feature_importances.argsort()[::-1][:5]

X_train1 = X_train[:,selected_feature_idex]
X_test1 = X_test[:,selected_feature_idex]

dtc1 = DecisionTreeClassifier()
dtc1.fit(X=X_train1,y=y_train)
y_pred1 = dtc1.predict(X=X_test1)
acc1 = (y_pred1 == y_test).mean()

print(acc1)


"""
19个特征,计算测试准确率
"""
for num_features in range(1,20,1):
    selected_feature_idex = feature_importances.argsort()[::-1][:num_features]
    print(selected_feature_idex.shape)
    X_train1 = X_train[:,selected_feature_idex]
    X_test1 = X_test[:,selected_feature_idex]
    print(X_train1.shape)
    dtc1.fit(X=X_train1,y=y_train)
    y_pred1 = dtc1.predict(X=X_test1)
    acc1 = (y_pred1 == y_test).mean()
    print(num_features,acc1)

4. 特征融合

        把所有特征中重要的成份抽出来,再注入到几个新的特征中,新生成的特征不是原来的任何一部分。(原地解散,根据实际需要,重新招人)

        PCA主成分分析法

from sklearn.decomposition import PCA
for num_features in range(1,20,1):
    pca = PCA(n_components=num_features)
    pca.fit(X=X_train)
    X_train2 = pca.transform(X=X_train)
    X_test2 = pca.transform(X=X_test)
    dtc2 = DecisionTreeClassifier()
    dtc2.fit(X=X_train2,y=y_train)
    y_pred2 = dtc2.predict(X=X_test2)
    acc2 = (y_pred2 == y_test).mean()
    print(num_features,acc2)

5. 特征分解

        FFT

import numpy as np
U, s, Vt = np.linalg.svd(a=X_train, full_matrices=False)
print("U的形状:", U.shape)  
print("奇异值:", s)  
print("Vt的形状:", Vt.shape)  

from matplotlib import pyplot as plt
plt.scatter(range(len(s)),s)

线性模型

  • 线性回归
  • 逻辑回归
    • 二分类算法
    • 在线性回归的基础上,增加了一个sigmoid激活函数
    • 优化:梯度下降法 SGD (Stochastic Gradient Descent)
import joblib
_, [X_train,y_train,X_test,y_test]=joblib.load(filename="all_data.csblog")
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(X=X_train, y=y_train)
y_pred = lr.predict(X=X_test)
(y_pred == y_test).mean()

# 19个权重,系数
lr.coef_

# 1个偏置
lr.intercept_
  • 线性?
    • 自变量和因变量都是一次方关系
    • 因变量y是自变量x的线性组合
    • y = kx +b(直线)
    • y = k1x1 + k2x2 +b(平面)
    • y = k1x1 + k2x2 +...+ knxn +b(超平面)
    • 所在纬度的空间(欧式空间,向量空间)内,最简单的关系(超平面)
  • 回归?
    • regress 回归
    • regression
    • regressor
    • 生物学概念
    • 预测连续量
  • 线性回归?
    • 标签是一个连续量 
    • 把标签看做是特征的线性组合
    • y = k1x1 + k2x2 +...+knxn +b (假设函数)
    • weight:权重(斜率)
    • bias:偏置(截距)
    • 参数:
      • 可学习参数 learnable parameters(w,b)
      • 超参数 hyperparameters(learning rate, regularization)(人为制定,不能由模型修改)
    • 模型构建完成后,参数都是随机初始化。(不能进行精准预测)
    • 需要经过数据的训练,才能把参数确定下来。(可以进行精准预测)
"""
1. 读取数据
"""
import pandas as pd
data = pd.read_csv(filepath_or_buffer="./boston_house_prices.csv",skiprows=1)
data.info()
X = data.drop(columns=["MEDV"]).to_numpy()
y = data["MEDV"].to_numpy()

"""
2. 切分数据 & 标准化
"""
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
mu = X_train.mean(axis=0)
sigma = X_train.std(axis=0)
X_train1 = (X_train-mu)/sigma
X_test1 = (X_test-mu) /sigma

"""
3. 套用模型
"""
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X=X_train1,y=y_train)
y_pred = lr.predict(X = X_test1)

# 平均绝对误差, Mean Absolute Error, MAE,更能反应事物的本质
abs(y_pred - y_test).mean()

# 平均平方误差, Mean Squared Error, MSE
loss = ((y_pred - y_test)**2).mean()

        

迭代思想

    迭代法:

  • 问题不能一步到位的解决。

  • 采用迭代的思想来解决,有三个重点。

    • 1. 要有随机random初始化(rough start)(普适性);

    • 2. 要有一个逐步变好的策略(优化细节);

    • 3. 要有一个退出的条件(适时退出)。

KMeans聚类算法

深度学习 - 梯度下降法

数据预处理

操作:

  • 中心化
    • 减均值
  • 归一化
    • 压缩到【0,1】
  • 标准化
    • 减均值,除标准差

意义:

  • 加速模型收敛

特点:

  • 数据表面上被改变了
  • 数据内部的信息没有被改变
import numpy as np
from matplotlib import pyplot as plt
scores = np.random.randint(low=0,high=101,size=(30,))
plt.plot(scores)

#中心化
scores1 = scores - scores.mean()

#归一化
min_ = scores.min()
max_ = scores.max()
scores2 = (scores - min_)/(max_ - min_)
plt.plot(scores2)


# 标准化
mu = scores.mean()
sigma = scores.std()
scores3 = (scores - mu)/sigma
plt.plot(scores3)

信息是隐藏在相对大小中,而不是绝对大小中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值