当前位置:   article > 正文

勾八头歌之分类回归聚类

勾八头歌之分类回归聚类

一、机器学习概述

  第1关机器学习概述

B AD B BC

  第2关常见分类算法

  1. #编码方式encoding=utf8
  2. from sklearn.neighbors import KNeighborsClassifier
  3. def knn(train_data,train_label,test_data):
  4. '''
  5. input:train_data用来训练的数据
  6. train_label用来训练的标签
  7. test_data用来测试的数据
  8. '''
  9. #********* Begin *********#开始填补空缺处代码
  10. knn = KNeighborsClassifier()
  11. #利用训练数据与标签对模型进行训练
  12. knn.fit(train_data, train_label)
  13. #对测试数据类别进行预测
  14. predict = knn.predict(test_data)
  15. #********* End *********#结束填补位置
  16. return predict

  第3关常见回归算法

  1. #编码方式encoding=utf8
  2. from sklearn.linear_model import LinearRegression
  3. def lr(train_data,train_label,test_data):
  4. '''
  5. input:train_data用来训练的数据
  6. train_label用来训练的标签
  7. test_data用来测试的数据
  8. '''
  9. #********* Begin *********#开始填补空缺处代码
  10. lr = LinearRegression()
  11. #利用已知数据与标签对模型进行训练
  12. lr.fit(train_data, train_label)
  13. #对未知数据进行预测
  14. predict = lr.predict(test_data)
  15. #********* End *********#
  16. return predict

  第4关常见聚类算法

  1. from sklearn.cluster import KMeans
  2. def kmeans(data):
  3. '''
  4. input:data需要进行聚类的数据
  5. '''
  6. # 假设我们想要将数据聚成3类,这个数字可以根据实际情况调整
  7. kmeans = KMeans(n_clusters=3, random_state=888)
  8. # 使用fit_predict一步完成模型训练和预测
  9. predict = kmeans.fit_predict(data)
  10. return predict # 返回聚类结果

第五关实现KNN算法

  1. import numpy as np
  2. class kNNClassifier(object):
  3. def __init__(self, k):
  4. '''
  5. 初始化函数
  6. :param k:kNN算法中的k
  7. '''
  8. self.k = k
  9. # 用来存放训练数据,类型为ndarray
  10. self.train_feature = None
  11. # 用来存放训练标签,类型为ndarray
  12. self.train_label = None
  13. def fit(self, feature, label):
  14. '''
  15. kNN算法的训练过程
  16. :param feature: 训练集数据,类型为ndarray
  17. :param label: 训练集标签,类型为ndarray
  18. :return: 无返回
  19. '''
  20. # 将传入的训练数据和标签保存在对象内部,以便后续的预测使用
  21. self.train_feature = np.array(feature)
  22. self.train_label = np.array(label)
  23. def predict(self, feature):
  24. '''
  25. kNN算法的预测过程
  26. :param feature: 测试集数据,类型为ndarray
  27. :return: 预测结果,类型为ndarray或list
  28. '''
  29. def _predict(test_data):
  30. # 计算测试数据与所有训练数据之间的欧氏距离
  31. distances = [np.sqrt(np.sum((test_data - vec) ** 2)) for vec in self.train_feature]
  32. # 获取距离最近的训练数据的索引
  33. nearest = np.argsort(distances)
  34. # 选取最近的 k 个邻居
  35. topK = [self.train_label[i] for i in nearest[:self.k]]
  36. votes = {} # 用字典来记录每个类别的投票数
  37. result = None
  38. max_count = 0 # 用来记录最高票数
  39. for label in topK:
  40. if label in votes:
  41. votes[label] += 1
  42. else:
  43. votes[label] = 1
  44. # 更新最高票数和对应的类别
  45. if votes[label] > max_count:
  46. max_count = votes[label]
  47. result = label
  48. return result
  49. # 对测试集中的每个数据进行预测
  50. predict_result = [_predict(test_data) for test_data in feature]
  51. return predict_result

二、机器学习—线性回归

第1关简单线性回归与多元线性回归

第2关线性回归的正规方程解

  1. import numpy as np
  2. def mse_score(y_predict, y_test):
  3. '''
  4. input:y_predict(ndarray):预测值
  5. y_test(ndarray):真实值
  6. output:mse(float):mse损失函数值
  7. '''
  8. # 计算均方误差
  9. mse = np.mean((y_predict - y_test) ** 2)
  10. return mse
  11. class LinearRegression:
  12. def __init__(self):
  13. '''初始化线性回归模型'''
  14. self.theta = None
  15. def fit_normal(self, train_data, train_label):
  16. '''
  17. input:train_data(ndarray):训练样本
  18. train_label(ndarray):训练标签
  19. '''
  20. # 在训练数据前添加一列1,对应theta0
  21. X_b = np.hstack([np.ones((len(train_data), 1)), train_data])
  22. # 使用正规方程求解theta
  23. self.theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(train_label)
  24. def predict(self, test_data):
  25. '''
  26. input:test_data(ndarray):测试样本
  27. '''
  28. # 在测试数据前添加一列1,对应theta0
  29. X_b = np.hstack([np.ones((len(test_data), 1)), test_data])
  30. # 使用模型进行预测
  31. y_predict = X_b.dot(self.theta)
  32. return y_predict

第3关衡量线性回归的性能指标

  1. import numpy as np
  2. #mse
  3. def mse_score(y_predict, y_test):
  4. mse = np.mean((y_predict - y_test) ** 2)
  5. return mse
  6. #r2
  7. def r2_score(y_predict, y_test):
  8. '''
  9. input:y_predict(ndarray):预测值
  10. y_test(ndarray):真实值
  11. output:r2(float):r2值
  12. '''
  13. # 计算R2分数
  14. ss_total = np.sum((y_test - np.mean(y_test)) ** 2)
  15. ss_residual = np.sum((y_test - y_predict) ** 2)
  16. r2 = 1 - (ss_residual / ss_total)
  17. return r2
  18. class LinearRegression:
  19. def __init__(self):
  20. '''初始化线性回归模型'''
  21. self.theta = None
  22. def fit_normal(self, train_data, train_label):
  23. '''
  24. input:train_data(ndarray):训练样本
  25. train_label(ndarray):训练标签
  26. '''
  27. # 在训练数据前添加一列1,对应theta0
  28. X_b = np.hstack([np.ones((len(train_data), 1)), train_data])
  29. # 使用正规方程求解theta
  30. self.theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(train_label)
  31. return self
  32. def predict(self, test_data):
  33. '''
  34. input:test_data(ndarray):测试样本
  35. '''
  36. # 在测试数据前添加一列1,对应theta0
  37. X_b = np.hstack([np.ones((len(test_data), 1)), test_data])
  38. # 使用模型进行预测
  39. y_predict = X_b.dot(self.theta)
  40. return y_predict

第4关scikit-learn线性回归实践 - 波斯顿房价预测

  1. #encoding=utf8
  2. #encoding=utf8
  3. #********* Begin *********#
  4. import pandas as pd
  5. from sklearn.linear_model import LinearRegression
  6. # 获取训练数据
  7. train_data = pd.read_csv('./step3/train_data.csv')
  8. # 获取训练标签
  9. train_label = pd.read_csv('./step3/train_label.csv')
  10. train_label = train_label['target']
  11. # 获取测试数据
  12. test_data = pd.read_csv('./step3/test_data.csv')
  13. lr = LinearRegression()
  14. # 训练模型
  15. lr.fit(train_data, train_label)
  16. # 获取预测标签
  17. predict = lr.predict(test_data)
  18. # 将预测标签写入csv
  19. df = pd.DataFrame({'result': predict})
  20. df.to_csv('./step3/result.csv', index=False)
  21. #********* End *********#

三、机器学习 --- 模型评估、选择与验证

第1关:为什么要有训练集与测试集

第2关欠拟合与过拟合

第3关偏差与方差

第4关验证集与交叉验证

第5关衡量回归性能指标

第6关准确度的陷阱与混淆矩阵

  1. import numpy as np
  2. def confusion_matrix(y_true, y_predict):
  3. '''
  4. 构建二分类的混淆矩阵,并将其返回
  5. :param y_true: 真实类别,类型为ndarray
  6. :param y_predict: 预测类别,类型为ndarray
  7. :return: shape为(2, 2)的ndarray
  8. '''
  9. # 定义计算混淆矩阵各元素的函数
  10. def TN(y_true, y_predict):
  11. return np.sum((y_true == 0) & (y_predict == 0))
  12. def FP(y_true, y_predict):
  13. return np.sum((y_true == 0) & (y_predict == 1))
  14. def FN(y_true, y_predict):
  15. return np.sum((y_true == 1) & (y_predict == 0))
  16. def TP(y_true, y_predict):
  17. return np.sum((y_true == 1) & (y_predict == 1))
  18. # 构建并返回混淆矩阵
  19. return np.array([
  20. [TN(y_true, y_predict), FP(y_true, y_predict)],
  21. [FN(y_true, y_predict), TP(y_true, y_predict)]
  22. ])

第7关精准率与召回率

  1. import numpy as np
  2. def precision_score(y_true, y_predict):
  3. '''
  4. 计算精准率并返回
  5. :param y_true: 真实类别,类型为ndarray
  6. :param y_predict: 预测类别,类型为ndarray
  7. :return: 精准率,类型为float
  8. '''
  9. # 定义计算真正例(TP)和假正例(FP)的函数
  10. def TP(y_true, y_predict):
  11. return np.sum((y_true == 1) & (y_predict == 1))
  12. def FP(y_true, y_predict):
  13. return np.sum((y_true == 0) & (y_predict == 1))
  14. # 计算TP和FP
  15. tp = TP(y_true, y_predict)
  16. fp = FP(y_true, y_predict)
  17. # 计算精准率并返回
  18. try:
  19. return tp / (tp + fp)
  20. except:
  21. return 0.0
  22. def recall_score(y_true, y_predict):
  23. '''
  24. 计算召回率并返回
  25. :param y_true: 真实类别,类型为ndarray
  26. :param y_predict: 预测类别,类型为ndarray
  27. :return: 召回率,类型为float
  28. '''
  29. # 定义计算真正例(TP)和假负例(FN)的函数
  30. def FN(y_true, y_predict):
  31. return np.sum((y_true == 1) & (y_predict == 0))
  32. def TP(y_true, y_predict):
  33. return np.sum((y_true == 1) & (y_predict == 1))
  34. # 计算TP和FN
  35. tp = TP(y_true, y_predict)
  36. fn = FN(y_true, y_predict)
  37. # 计算召回率并返回
  38. try:
  39. return tp / (tp + fn)
  40. except:
  41. return 0.0

第8关F1 Score

  1. import numpy as np
  2. def f1_score(precision, recall):
  3. '''
  4. 计算模型的F1分数并返回
  5. :param precision: 模型的精准率,类型为float
  6. :param recall: 模型的召回率,类型为float
  7. :return: 模型的f1 score,类型为float
  8. '''
  9. # 计算F1分数
  10. try:
  11. return 2 * precision * recall / (precision + recall)
  12. except:
  13. return 0.0

第9关ROC曲线与AUC

  1. import numpy as np
  2. def calAUC(prob, labels):
  3. '''
  4. 计算AUC并返回
  5. :param prob: 模型预测样本为Positive的概率列表,类型为ndarray
  6. :param labels: 样本的真实类别列表,其中1表示Positive,0表示Negtive,类型为ndarray
  7. :return: AUC,类型为float
  8. '''
  9. # 将概率和标签组合并按概率排序
  10. f = list(zip(prob, labels))
  11. rank = [values2 for values1, values2 in sorted(f, key=lambda x: x[0])]
  12. # 获取正样本的排名列表
  13. rankList = [i + 1 for i in range(len(rank)) if rank[i] == 1]
  14. # 计算正负样本的数量
  15. posNum = sum(labels)
  16. negNum = len(labels) - posNum
  17. # 根据公式计算AUC
  18. auc = (sum(rankList) - (posNum * (posNum + 1)) / 2) / (posNum * negNum)
  19. return auc

第10关sklearn中的分类性能指标

  1. from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score
  2. def classification_performance(y_true, y_pred, y_prob):
  3. '''
  4. 返回准确度、精准率、召回率、f1 Score和AUC
  5. :param y_true: 样本的真实类别,类型为`ndarray`
  6. :param y_pred: 模型预测出的类别,类型为`ndarray`
  7. :param y_prob: 模型预测样本为`Positive`的概率,类型为`ndarray`
  8. :return: 准确度、精准率、召回率、f1 Score和AUC,类型为tuple
  9. '''
  10. # 计算并返回各种性能指标
  11. return accuracy_score(y_true, y_pred), precision_score(y_true, y_pred), recall_score(y_true, y_pred), f1_score(y_true, y_pred), roc_auc_score(y_true, y_prob)

四、聚类性能评估指标

第1关外部指标

  1. import numpy as np
  2. def calc_JC(y_true, y_pred):
  3. '''
  4. 计算并返回JC系数
  5. :param y_true: 参考模型给出的簇,类型为ndarray
  6. :param y_pred: 聚类模型给出的簇,类型为ndarray
  7. :return: JC系数
  8. '''
  9. def a(y_true, y_pred):
  10. result = 0
  11. for i in range(len(y_true)):
  12. for j in range(len(y_pred)):
  13. if i < j:
  14. if y_true[i] == y_true[j] and y_pred[i] == y_pred[j]:
  15. result += 1
  16. return result
  17. def b(y_true, y_pred):
  18. result = 0
  19. for i in range(len(y_true)):
  20. for j in range(len(y_pred)):
  21. if i < j:
  22. if y_true[i] != y_true[j] and y_pred[i] == y_pred[j]:
  23. result += 1
  24. return result
  25. def c(y_true, y_pred):
  26. result = 0
  27. for i in range(len(y_true)):
  28. for j in range(len(y_pred)):
  29. if i < j:
  30. if y_true[i] == y_true[j] and y_pred[i] != y_pred[j]:
  31. result += 1
  32. return result
  33. return a(y_true, y_pred) / (a(y_true, y_pred) + b(y_true, y_pred) + c(y_true, y_pred))
  34. def calc_FM(y_true, y_pred):
  35. '''
  36. 计算并返回FM指数
  37. :param y_true: 参考模型给出的簇,类型为ndarray
  38. :param y_pred: 聚类模型给出的簇,类型为ndarray
  39. :return: FM指数
  40. '''
  41. def a(y_true, y_pred):
  42. result = 0
  43. for i in range(len(y_true)):
  44. for j in range(len(y_pred)):
  45. if i < j:
  46. if y_true[i] == y_true[j] and y_pred[i] == y_pred[j]:
  47. result += 1
  48. return result
  49. def b(y_true, y_pred):
  50. result = 0
  51. for i in range(len(y_true)):
  52. for j in range(len(y_pred)):
  53. if i < j:
  54. if y_true[i] != y_true[j] and y_pred[i] == y_pred[j]:
  55. result += 1
  56. return result
  57. def c(y_true, y_pred):
  58. result = 0
  59. for i in range(len(y_true)):
  60. for j in range(len(y_pred)):
  61. if i < j:
  62. if y_true[i] == y_true[j] and y_pred[i] != y_pred[j]:
  63. result += 1
  64. return result
  65. return a(y_true, y_pred) / np.sqrt((a(y_true, y_pred) + b(y_true, y_pred)) * (a(y_true, y_pred) + c(y_true, y_pred)))
  66. def calc_Rand(y_true, y_pred):
  67. '''
  68. 计算并返回Rand指数
  69. :param y_true: 参考模型给出的簇,类型为ndarray
  70. :param y_pred: 聚类模型给出的簇,类型为ndarray
  71. :return: Rand指数
  72. '''
  73. def a(y_true, y_pred):
  74. result = 0
  75. for i in range(len(y_true)):
  76. for j in range(len(y_pred)):
  77. if i < j:
  78. if y_true[i] == y_true[j] and y_pred[i] == y_pred[j]:
  79. result += 1
  80. return result
  81. def d(y_true, y_pred):
  82. result = 0
  83. for i in range(len(y_true)):
  84. for j in range(len(y_pred)):
  85. if i < j:
  86. if y_true[i] != y_true[j] and y_pred[i] != y_pred[j]:
  87. result += 1
  88. return result
  89. m = len(y_true)
  90. return (2 * (a(y_true, y_pred) + d(y_true, y_pred))) / (m * (m - 1))

第2关内部指标

  1. import numpy as np
  2. def calc_DBI(feature, pred):
  3. '''
  4. 计算并返回DB指数
  5. :param feature: 待聚类数据的特征,类型为`ndarray`
  6. :param pred: 聚类后数据所对应的簇,类型为`ndarray`
  7. :return: DB指数
  8. '''
  9. #********* Begin *********#
  10. label_set = np.unique(pred)
  11. mu = {}
  12. label_count = {}
  13. #计算簇的中点
  14. for label in label_set:
  15. mu[label] = np.zeros([len(feature[0])])
  16. label_count[label] = 0
  17. for i in range(len(pred)):
  18. mu[pred[i]] += feature[i]
  19. label_count[pred[i]] += 1
  20. for key in mu.keys():
  21. mu[key] /= label_count[key]
  22. #算数据到中心点的平均距离
  23. avg_d = {}
  24. for label in label_set:
  25. avg_d[label] = 0
  26. for i in range(len(pred)):
  27. avg_d[pred[i]] += np.sqrt(np.sum(np.square(feature[i] - mu[pred[i]])))
  28. for key in mu.keys():
  29. avg_d[key] /= label_count[key]
  30. #算两个簇的中点之间的距离
  31. cen_d = []
  32. for i in range(len(label_set)-1):
  33. t = {'c1':label_set[i], 'c2':label_set[i+1], 'dist':np.sqrt(np.sum(np.square(mu[label_set[i]] - mu[label_set[i+1]])))}
  34. cen_d.append(t)
  35. dbi = 0
  36. for k in range(len(label_set)):
  37. max_item = 0
  38. for i in range(len(label_set)):
  39. for j in range(i, len(label_set)):
  40. for p in range(len(cen_d)):
  41. if cen_d[p]['c1'] == label_set[i] and cen_d[p]['c2'] == label_set[j]:
  42. d = (avg_d[label_set[i]] + avg_d[label_set[j]])/cen_d[p]['dist']
  43. if d > max_item:
  44. max_item = d
  45. dbi += max_item
  46. dbi /= len(label_set)
  47. return dbi
  48. #********* End *********#
  49. def calc_DI(feature, pred):
  50. '''
  51. 计算并返回Dunn指数
  52. :param feature: 待聚类数据的特征,类型为`ndarray`
  53. :param pred: 聚类后数据所对应的簇,类型为`ndarray`
  54. :return: Dunn指数
  55. '''
  56. #********* Begin *********#
  57. label_set = np.unique(pred)
  58. min_d = []
  59. for i in range(len(label_set)-1):
  60. t = {'c1': label_set[i], 'c2': label_set[i+1], 'dist': np.inf}
  61. min_d.append(t)
  62. #计算两个簇之间的最短距离
  63. for i in range(len(feature)):
  64. for j in range(i, len(feature)):
  65. for p in range(len(min_d)):
  66. if min_d[p]['c1'] == pred[i] and min_d[p]['c2'] == pred[j]:
  67. d = np.sqrt(np.sum(np.square(feature[i] - feature[j])))
  68. if d < min_d[p]['dist']:
  69. min_d[p]['dist'] = d
  70. #计算同一个簇中距离最远的样本对的距离
  71. max_diam = 0
  72. for i in range(len(feature)):
  73. for j in range(i, len(feature)):
  74. if pred[i] == pred[j]:
  75. d = np.sqrt(np.sum(np.square(feature[i] - feature[j])))
  76. if d > max_diam:
  77. max_diam = d
  78. di = np.inf
  79. for i in range(len(label_set)):
  80. for j in range(i, len(label_set)):
  81. for p in range(len(min_d)):
  82. d = min_d[p]['dist']/max_diam
  83. if d < di:
  84. di = d
  85. return d

第3关sklearn中的聚类性能评估指标

  1. from sklearn.metrics.cluster import fowlkes_mallows_score, adjusted_rand_score
  2. def cluster_performance(y_true, y_pred):
  3. '''
  4. 返回Rand指数和FM指数
  5. :param y_true:参考模型的簇划分,类型为`ndarray`
  6. :param y_pred:聚类模型给出的簇划分,类型为`ndarray`
  7. :return: Rand指数,FM指数
  8. '''
  9. #********* Begin *********#
  10. return fowlkes_mallows_score(y_true, y_pred), adjusted_rand_score(y_true, y_pred)
  11. #********* End *********#

七、机器学习—逻辑回归

第1关逻辑回归核心思想

  1. #encoding=utf8
  2. import numpy as np
  3. def sigmoid(t):
  4. '''
  5. 完成sigmoid函数计算
  6. :param t: 负无穷到正无穷的实数
  7. :return: 转换后的概率值
  8. :可以考虑使用np.exp()函数
  9. '''
  10. # 使用np.exp()函数计算e的t次方,然后除以1加上e的t次方
  11. return 1 / (1 + np.exp(-t))

第2关逻辑回归的损失函数

A ACD AB D

第3关梯度下降

  1. def gradient_descent(initial_theta, eta=0.05, n_iters=1000, epslion=1e-8):
  2. '''
  3. 梯度下降
  4. :param initial_theta: 参数初始值,类型为float
  5. :param eta: 学习率,类型为float
  6. :param n_iters: 训练轮数,类型为int
  7. :param epslion: 容忍误差范围,类型为float
  8. :return: 训练后得到的参数
  9. '''
  10. theta = initial_theta
  11. i = 0
  12. while i < n_iters:
  13. i += 1
  14. gradient = 2 * (theta - 3)
  15. if abs(gradient) < epslion:
  16. break
  17. theta = theta - eta * gradient
  18. return theta
  19. # 调用梯度下降函数
  20. theta = gradient_descent(initial_theta=0)

后面的暂时不写

前面四个时必须写的其他等我闲了再写

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/349399
推荐阅读
相关标签
  

闽ICP备14008679号