如何判断特征的重要性?
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)
信息是隐藏在相对大小中,而不是绝对大小中。