K近邻算法在时间序列预测中的应用

版权申诉
5星 · 超过95%的资源 2 下载量 37 浏览量 更新于2024-10-28 1 收藏 6KB ZIP 举报
在时间序列预测中,kNN算法可用于根据最近的历史数据点来预测未来某一点的数据值。该算法的核心思想是如果一个数据点的k个最近邻点中的大多数属于某一个类别,则该数据点也属于这个类别,或者取这些最近邻点的均值作为预测值。 kNN算法的特点包括简单易懂、易于实现,不需要事先训练模型,直接根据输入数据进行预测。但它也有一些局限性,比如对大数据集的计算成本高,因为它需要在整个数据集中搜索最近的k个邻居。另外,k值的选择以及距离度量方式对于算法的性能有很大影响。 在时间序列预测中应用kNN算法,我们通常会选取时间序列中的一个时间窗口内的数据作为特征,以此来预测未来的某个时间点的数据值。例如,我们可能选择最近的10个时间点作为特征,来预测下一个时间点的值。为了提高预测的准确性,可能需要对时间序列数据进行平滑或差分处理,以减少噪声和趋势的影响。 在实际应用中,kNN算法可以结合其他时间序列预测技术,如ARIMA模型、指数平滑等,来提高预测的准确性。同时,利用适当的特征提取技术和数据预处理手段,如主成分分析(PCA)、小波变换等,可以帮助进一步提升kNN算法在时间序列预测中的表现。 在提供的文件中,我们可以预期包含了实现kNN算法进行时间序列预测的源代码,该代码可能涉及到数据预处理、特征选择、距离度量、k值选择、邻居搜索以及预测结果输出等多个步骤。这些步骤对于理解算法的具体实现和预测性能至关重要。 对于希望深入学习和使用kNN算法进行时间序列预测的用户来说,这个压缩包中的文件将会是一个宝贵的资源。它不仅能够帮助用户理解kNN算法在时间序列预测中的应用,还能让用户了解如何选择合适的k值,如何选择合适的数据特征,以及如何处理预测结果等实际问题。此外,该资源也可能包含一些预处理和后处理的代码,这有助于用户在不同的时间序列预测场景中更加灵活地运用kNN算法。 总之,该资源是学习和应用kNN算法进行时间序列预测的重要参考,它可能包含了完整的代码实现,详细的文档说明以及一些示例数据。通过学习和实践这些内容,用户能够对kNN算法有更深入的理解,并能够将算法应用于实际的时间序列预测任务中,从而对预测未来数据点产生积极的影响。"

import pandas as pd import numpy as np import os from pprint import pprint from pandas import DataFrame from scipy import interpolate data_1_hour_predict_raw = pd.read_excel('./data/附件1 监测点A空气质量预报基础数据.xlsx' ) data_1_hour_actual_raw = pd.read_excel('./data/附件1 监测点A空气质量预报基础数据.xlsx' ) data_1_day_actual_raw = pd.rea df_1_predict = data_1_hour_actual_raw df_1_actual = data_1_day_actual_raw df_1_predict.set_axis( ['time', 'place', 'so2', 'no2', 'pm10', 'pm2.5', 'o3', 'co', 'temperature', 'humidity', 'pressure', 'wind', 'direction'], axis='columns', inplace=True) df_1_actual.set_axis(['time', 'place', 'so2', 'no2', 'pm10', 'pm2.5', 'o3', 'co'], axis='columns', inplace=True) modeltime_df_actual = df_1_actual['time'] modeltime_df_pre = df_1_predict['time'] df_1_actual = df_1_actual.drop(columns=['place', 'time']) df_1_predict = df_1_predict.drop(columns=['place', 'time']) df_1_predict = df_1_predict.replace('—', np.nan) df_1_predict = df_1_predict.astype('float') df_1_predict[df_1_predict < 0] = np.nan # 重新插入time列 df_1_actual.insert(0, 'time', modeltime_df_actual) df_1_predict.insert(0, 'time', modeltime_df_pre) # 线性插值的方法需要单独处理最后一行的数据 data_1_actual = df_1_actual[0:-3] data_1_predict = df_1_predict data_1_predict.iloc[-1:]['pm10'] = 22.0 data_1_actual_knn = df_1_actual[0:-3] data_1_predict_knn: DataFrame = df_1_predict for indexs in data_1_actual.columns: if indexs == 'time': continue data_1_actual['rownum'] = np.arange(data_1_actual.shape[0]) df_nona = data_1_actual.dropna(subset=[indexs]) f = interpolate.interp1d(df_nona['rownum'], df_nona[indexs]) data_1_actual[indexs] = f(data_1_actual['rownum']) data_1_actual = data_1_actual.drop(columns=['rownum']) for indexs in data_1_predict.columns: if indexs == 'time': continue data_1_predict['rownum'] = np.arange(data_1_predict.shape[0]) df_nona = data_1_predict.dropna(subset=[indexs]) f = interpolate.interp1d(df_nona['rownum'], df_nona[indexs]) data_1_predict[indexs] = f(data_1_predict['rownum']) data_1_predict = data_1_predict.drop(columns=['rownum']) writer = pd.E

101 浏览量

import seaborn as sns corrmat = df.corr() top_corr_features = corrmat.index plt.figure(figsize=(16,16)) #plot heat map g=sns.heatmap(df[top_corr_features].corr(),annot=True,cmap="RdYlGn") plt.show() sns.set_style('whitegrid') sns.countplot(x='target',data=df,palette='RdBu_r') plt.show() dataset = pd.get_dummies(df, columns = ['sex', 'cp', 'fbs','restecg', 'exang', 'slope', 'ca', 'thal']) from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler standardScaler = StandardScaler() columns_to_scale = ['age', 'trestbps', 'chol', 'thalach', 'oldpeak'] dataset[columns_to_scale] = standardScaler.fit_transform(dataset[columns_to_scale]) dataset.head() y = dataset['target'] X = dataset.drop(['target'], axis=1) from sklearn.model_selection import cross_val_score knn_scores = [] for k in range(1, 21): knn_classifier = KNeighborsClassifier(n_neighbors=k) score = cross_val_score(knn_classifier, X, y, cv=10) knn_scores.append(score.mean()) plt.plot([k for k in range(1, 21)], knn_scores, color='red') for i in range(1, 21): plt.text(i, knn_scores[i - 1], (i, knn_scores[i - 1])) plt.xticks([i for i in range(1, 21)]) plt.xlabel('Number of Neighbors (K)') plt.ylabel('Scores') plt.title('K Neighbors Classifier scores for different K values') plt.show() knn_classifier = KNeighborsClassifier(n_neighbors = 12) score=cross_val_score(knn_classifier,X,y,cv=10) score.mean() from sklearn.ensemble import RandomForestClassifier randomforest_classifier= RandomForestClassifier(n_estimators=10) score=cross_val_score(randomforest_classifier,X,y,cv=10) score.mean()的roc曲线的代码

150 浏览量

请教学式按句详细讲解以下代码:###--------------------KNN算法与决策树算法-------------------- from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split # 将文本数据转化为数值特征 vectorizer = TfidfVectorizer() X = vectorizer.fit_transform(data_str_list) # 划分数据集为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 特征缩放 scaler = StandardScaler() X_train = scaler.fit_transform(X_train.toarray()) X_test = scaler.transform(X_test.toarray()) from sklearn.neighbors import KNeighborsClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import GridSearchCV from sklearn.metrics import accuracy_score # 使用网格搜索进行超参数调优 param_grid = { "n_neighbors": [3, 5, 7, 9], "weights": ["uniform", "distance"], "algorithm": ["auto", "ball_tree", "kd_tree", "brute"] } knn = KNeighborsClassifier() grid_search = GridSearchCV(knn, param_grid, cv=5) grid_search.fit(X_train, y_train) print("KNN最优参数:", grid_search.best_params_) param_grid = { "criterion": ["gini", "entropy"], "max_depth": [3, 5, 7, 9] } dt = DecisionTreeClassifier() grid_search = GridSearchCV(dt, param_grid, cv=5) grid_search.fit(X_train, y_train) print("决策树最优参数:", grid_search.best_params_) # 训练分类器并进行预测 knn = KNeighborsClassifier(n_neighbors=5, weights="uniform", algorithm="auto") knn.fit(X_train, y_train) knn_pred = knn.predict(X_test) dt = DecisionTreeClassifier(criterion="gini", max_depth=9) dt.fit(X_train, y_train) dt_pred = dt.predict(X_test) # 混合使用KNN和决策树进行文本分类 ensemble_pred = [] for i in range(len(knn_pred)): if knn_pred[i] == dt_pred[i]: ensemble_pred.append(knn_pred[i]) else: ensemble_pred.append(knn_pred[i]) # 输出分类结果和准确率 print("KNN准确率:", accuracy_score(y_test, knn_pred)) print("决策树准确率:", accuracy_score(y_test, dt_pred)) print("混合使用准确率:", accuracy_score(y_test, ensemble_pred))

157 浏览量