Python 加载 .arff数据

面临问题:

对于形如下面的.arff数据加载失败

图1 数据属性展示

图2 数据样本展示

数据解释:

一个{}表示一个实例样本,其中{}中逗号分隔一个数据特征(属性)和特征(属性)取值

例如,对于第一个样本:

{8 1, 11 1, 61 1, 62 1, 63 2, 64 3, 65 1, 66 1, 67 1, 68 1, 69 1, 70 1, 71 1, 72 1, 73 1, 74 1, 75 1, 76 1, 77 1, 78 1, 79 1, 80 1, 81 1, 82 1, 83 1, 84 1, 85 1, 86 1, 87 1, 88 1, 89 1, 90 1, 91 1, 92 3, 93 1, 94 1, 95 1, 96 1, 97 1, 98 1, 99 1, 100 1, 101 1, 102 1, 103 1, 104 1, 105 1, 106 1, 107 1, 108 1, 109 1, 110 1, 111 1, 112 1, 113 2, 114 1, 115 1, 116 1, 117 1, 118 1, 119 4, 120 1, 121 1, 122 1, 123 1, 124 1, 23168 1}

8 1,         这里8表示图1中的@attribute Att9 numeric 的特征取值为1。(因为属性的索引是从0开始的)(图4展示了加载后的对应属性的结果)

而0-7的属性在这里没有记录,这表明,这些属性的取值是0

问题阐述:

对于上面的数据,如果直接在python中进行数据加载时会面临:

from scipy.io import arff

path = 'E:/Arts1.arff'

data, meta = arff.loadarff(path)

解决:

import numpy as np
import pandas as pd
 
def parse_row(line, len_row):
    line = line.replace('{', '').replace('}', '')
 
    row = np.zeros(len_row)
    for data in line.split(','):
        index, value = data.split()
        row[int(index)] = float(value)
 
    return row
 
def read_data_arff(filename):
    # Step 1. Read data by row.
    with open(filename, 'r') as fp:
        file_content = fp.readlines()
 
    # Step 2. Get the columns.
    columns = []
    len_attr = len('@attribute')
 
    for line in file_content:
        if line.startswith('@attribute '):
            col_name = line[len_attr:].split()[0]
            columns.append(col_name)
 
    # Step 3. Get the rows.
    rows = []
    len_row = len(columns)
 
    for line in file_content:
        if line.startswith('{'):
            rows.append(parse_row(line, len_row))
 
    # Step 4. Return the results.
    df = pd.DataFrame(data=rows, columns=columns)
 
    return df

结果展示:

path = 'E:/Arts1.arff'
data = read_data_arff(path)

图3 加载数据

图4 对应第一个样本的8,1

图5 标签空间

其他参考:Pandas直接读取arff格式的文件_arff2pandas-CSDN博客

离散化数据属性通常是指将连续数值型的数据转换成离散的类别,以便于后续的分析处理,比如机器学习模型构建。以"glass.arff"数据集为例,这个数据集通常用于分类问题,其中RI(refractive index)是一个连续变量。 操作步骤分为两部分:等宽离散化和等频离散化。 1. **等宽离散化**: - **步骤1**: 首先,你需要导入相关的库,如`sklearn.datasets`、`pandas`和`matplotlib`。 ```python import pandas as pd from sklearn.datasets import load_breast_cancer import matplotlib.pyplot as plt ``` - **步骤2**: 加载数据集,并查看RI列。 ```python data = load_breast_cancer() df = pd.DataFrame(data.data, columns=data.feature_names) ri_data = df['RI'] ``` - **步骤3**: 定义离散区间宽度,例如选择5个区间。 ```python width = (ri_data.max() - ri_data.min()) / 5 breakpoints = [ri_data.min()] + [ri_data.min() + i * width for i in range(4)] + [ri_data.max()] ``` - **步骤4**: 进行等宽离散化,创建新的离散列。 ```python df['RI_discretized'] = pd.cut(ri_data, bins=breakpoints) ``` - **步骤5**: 可以使用`df['RI_discretized'].value_counts().plot(kind='bar')`绘制直方图展示结果。 2. **等频离散化**: - 步骤类似,只是需要计算每个区间包含的数据量相等,可以用`pd.qcut()`代替`pd.cut()`。 ```python n_bins = len(df)//5 # 根据总样本数确定区间的数量 df['RI_discretized_freq'] = pd.qcut(ri_data, q=n_bins, duplicates='drop') ``` 为了截图展示过程,您可以运行上述代码并在每一步之后截取窗口。请注意,由于这是一个文本环境,无法直接提供图片,但你可以按照上述步骤在本地环境中执行。
### 完整的KNN代码适配iris.csv数据集 以下是一个完整的独立代码版本,包括数据加载、预处理和模型应用的部分。 #### 数据加载与预处理 通过`pandas`库加载`iris.csv`文件,并将其转换为`numpy`数组以供后续使用。此外,对数据进行归一化处理以提高KNN算法的性能[^3]。 ```python import pandas as pd import numpy as np from sklearn.model_selection import train_test_split def load_and_preprocess_data(file_path, test_size=0.2): # 使用pandas读取CSV文件 data = pd.read_csv(file_path) # 假设最后一列为标签列 X = data.iloc[:, :-1].values # 特征 y = data.iloc[:, -1].values # 标签 # 将数据集划分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=42) # 归一化特征值 def autonorm(dataset): min_vals = dataset.min(0) max_vals = dataset.max(0) ranges = max_vals - min_vals norm_dataset = (dataset - min_vals) / ranges return norm_dataset, ranges, min_vals X_train_norm, _, _ = autonorm(X_train) X_test_norm, _, _ = autonorm(X_test) return X_train_norm, X_test_norm, y_train, y_test ``` #### KNN分类器实现 以下是对原始KNN代码的修改,确保其能够正确应用于`iris.csv`数据集。主要改动包括数据类型的转换和错误处理[^5]。 ```python class KNN: def __init__(self, k): self.k = k def fit(self, X, y): self.X = np.asarray(X) self.y = np.asarray(y) def predict(self, X): X = np.asarray(X) result = [] for x in X: dis = np.sqrt(np.sum((x - self.X) ** 2, axis=1)) index = dis.argsort() index = index[:self.k] count = np.bincount(self.y[index].astype(int)) # 确保标签为整数类型 result.append(count.argmax()) return np.asarray(result) ``` #### 模型评估 以下代码用于评估KNN模型的性能,计算预测准确率。 ```python def evaluate_model(knn_model, X_test, y_test): predictions = knn_model.predict(X_test) accuracy = np.mean(predictions == y_test) return accuracy ``` #### 主函数 将上述所有部分整合到主函数中,加载数据、训练模型并评估性能。 ```python if __name__ == "__main__": file_path = "iris.csv" X_train, X_test, y_train, y_test = load_and_preprocess_data(file_path) k_values = [1, 3, 5, 7, 9] accuracies = [] for k in k_values: knn = KNN(k) knn.fit(X_train, y_train) accuracy = evaluate_model(knn, X_test, y_test) accuracies.append(accuracy) print(f"当k={k}时,模型准确率为: {accuracy:.4f}") ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值